diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..929f216ac
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+idioma.lock linguist-generated=true
+content/docs/es/** linguist-generated=true
+**/_pages/page.es.tsx linguist-generated=true
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5c2ba504c..cb78ac3bc 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,6 +5,10 @@
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
},
+ "files.exclude": {
+ "**/content/docs/es/**": true,
+ "**/app/\\[locale\\]/**/_pages/page.es.tsx": true
+ },
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
diff --git a/.zed/settings.json b/.zed/settings.json
index a2aac229d..42499a085 100644
--- a/.zed/settings.json
+++ b/.zed/settings.json
@@ -1,26 +1,48 @@
{
"format_on_save": "on",
"formatter": "language_server",
+ "file_scan_exclusions": [
+ "**/content/docs/es/**",
+ "**/app/\\[locale\\]/**/_pages/page.es.tsx"
+ ],
"languages": {
"JavaScript": {
"format_on_save": "on",
"formatter": "language_server",
- "language_servers": ["biome", "!vtsls", "!typescript-language-server", "!eslint"]
+ "language_servers": [
+ "biome",
+ "!vtsls",
+ "!typescript-language-server",
+ "!eslint"
+ ]
},
"TypeScript": {
"format_on_save": "on",
"formatter": "language_server",
- "language_servers": ["biome", "!vtsls", "!typescript-language-server", "!eslint"]
+ "language_servers": [
+ "biome",
+ "!vtsls",
+ "!typescript-language-server",
+ "!eslint"
+ ]
},
"TSX": {
"format_on_save": "on",
"formatter": "language_server",
- "language_servers": ["biome", "!vtsls", "!typescript-language-server", "!eslint"]
+ "language_servers": [
+ "biome",
+ "!vtsls",
+ "!typescript-language-server",
+ "!eslint"
+ ]
},
"JSON": {
"format_on_save": "on",
"formatter": "language_server",
- "language_servers": ["biome", "..."]
+ "language_servers": [
+ "biome",
+ "..."
+ ]
},
"Markdown": {
"format_on_save": "on",
diff --git a/app/(docs)/error.tsx b/app/(docs)/error.tsx
deleted file mode 100644
index 39a19cc5b..000000000
--- a/app/(docs)/error.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-'use client';
-
-import Link from 'next/link';
-import React from 'react';
-
-export default function ErrorBoundary({
- error,
- reset,
-}: {
- error: Error & { digest?: string };
- reset: () => void;
-}) {
- React.useEffect(() => {
- // Hide sidebar for errors (including 404s)
- const aside = document.querySelector('aside');
- if (aside) {
- aside.style.display = 'none';
- }
-
- return () => {
- const asideCleanup = document.querySelector('aside');
- if (asideCleanup) {
- asideCleanup.style.display = '';
- }
- };
- }, []);
-
- // Check if this is likely a 404 error
- const is404 = error.message?.includes('404') || error.message?.includes('not found');
-
- return (
-
-
- {is404 ? 'Page not found' : 'Something went wrong'}
-
-
- {is404
- ? "The documentation you are looking for doesn't exist or has been moved."
- : 'An error occurred while loading this page.'}
-
-
-
- Back to homepage
-
- {!is404 && (
-
- Try again
-
- )}
-
-
- );
-}
diff --git a/app/(docs)/not-found.tsx b/app/(docs)/not-found.tsx
deleted file mode 100644
index 8be677752..000000000
--- a/app/(docs)/not-found.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import Link from 'next/link';
-
-export default function DocsNotFound() {
- return (
- <>
-
-
-
Page not found
-
- The documentation you are looking for doesn't exist or has been moved.
-
-
- Back to homepage
-
-
- >
- );
-}
diff --git a/app/(docs)/raw/[...slug]/route.ts b/app/(docs)/raw/[...slug]/route.ts
deleted file mode 100644
index 136b322ff..000000000
--- a/app/(docs)/raw/[...slug]/route.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { existsSync } from 'node:fs';
-import { readdir, readFile } from 'node:fs/promises';
-import { join } from 'node:path';
-import { type NextRequest, NextResponse } from 'next/server';
-
-async function findFileWithParentheses(
- basePath: string,
- segments: string[],
-): Promise {
- if (segments.length === 0) return null;
-
- const [current, ...rest] = segments;
- const currentPath = join(basePath, current);
-
- if (rest.length === 0) {
- if (existsSync(currentPath)) {
- return currentPath;
- }
- } else if (existsSync(currentPath)) {
- const found = await findFileWithParentheses(currentPath, rest);
- if (found) return found;
- }
-
- try {
- const entries = await readdir(basePath, { withFileTypes: true });
- for (const entry of entries) {
- if (entry.isDirectory() && entry.name.startsWith('(') && entry.name.endsWith(')')) {
- const parenthesesPath = join(basePath, entry.name);
-
- if (rest.length === 0) {
- const filePath = join(parenthesesPath, current);
- if (existsSync(filePath)) {
- return filePath;
- }
- } else {
- const found = await findFileWithParentheses(parenthesesPath, [current, ...rest]);
- if (found) return found;
- }
- }
- }
- } catch (error) {
- console.error(error);
- }
-
- return null;
-}
-
-export async function GET(
- _request: NextRequest,
- { params }: { params: Promise<{ slug: string[] }> },
-) {
- try {
- const { slug = [] } = await params;
- const basePath = join(process.cwd(), 'content/docs');
-
- const directPath = join(basePath, ...slug);
- if (existsSync(directPath)) {
- const content = await readFile(directPath, 'utf-8');
- return new NextResponse(content, {
- headers: {
- 'Content-Type': 'text/markdown; charset=utf-8',
- },
- });
- }
-
- const foundPath = await findFileWithParentheses(basePath, slug);
- if (foundPath) {
- const content = await readFile(foundPath, 'utf-8');
- return new NextResponse(content, {
- headers: {
- 'Content-Type': 'text/markdown; charset=utf-8',
- },
- });
- }
-
- return new NextResponse('File not found', { status: 404 });
- } catch (error) {
- return new NextResponse('File not found', { status: 404 });
- }
-}
diff --git a/app/(home)/icons.tsx b/app/(home)/icons.tsx
deleted file mode 100644
index 2a4a33f16..000000000
--- a/app/(home)/icons.tsx
+++ /dev/null
@@ -1,510 +0,0 @@
-import type { JSX, SVGProps } from 'react';
-
-export function HiroPlatformSVG(props: SVGProps) {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function FumaDocsSVG(props: SVGProps): JSX.Element {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function NextSVG(props: SVGProps): JSX.Element {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function SourceSVG(props: SVGProps): JSX.Element {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function VercelLogo(props: SVGProps): JSX.Element {
- return (
-
-
-
- );
-}
-
-export function NetlifyLogo(props: SVGProps): JSX.Element {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export function ContentlayerIcon(props: SVGProps): JSX.Element {
- return (
-
-
-
- );
-}
-
-export function OpenAPIIcon(props: SVGProps): JSX.Element {
- return (
-
-
-
- );
-}
-
-export function EarthIcon(props: SVGProps): JSX.Element {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/app/(home)/page.tsx b/app/[locale]/(home)/_pages/page.en.tsx
similarity index 100%
rename from app/(home)/page.tsx
rename to app/[locale]/(home)/_pages/page.en.tsx
diff --git a/app/[locale]/(home)/_pages/page.es.tsx b/app/[locale]/(home)/_pages/page.es.tsx
new file mode 100644
index 000000000..97d6ab0e1
--- /dev/null
+++ b/app/[locale]/(home)/_pages/page.es.tsx
@@ -0,0 +1,206 @@
+import { ImageZoom } from 'fumadocs-ui/components/image-zoom';
+import { Braces, Database, Play } from 'lucide-react';
+import { Card, Cards, SmallCard } from '@/components/card';
+import {
+ API,
+ Chainhook,
+ Clarinet,
+ Clarity,
+ Hiro,
+ Js,
+ Ordinals,
+ Runes,
+ StacksIcon,
+} from '@/components/ui/icon';
+import heroImage from '@/public/stacks-hero.svg';
+
+export default function HomePage() {
+ return (
+
+
+
+
+
+
+
+
+
Bienvenido a Hiro Docs
+
Encuentra todas las guías y recursos que necesitas para construir en Stacks.
+
+
+
+
+
+ }
+ href="/apis/stacks-blockchain-api"
+ title="Referencia de la API de Stacks"
+ description="Explora los puntos finales de la API para interactuar con la cadena de bloques Stacks."
+ />
+
+
+ }
+ href="/resources/guides"
+ title="Guías"
+ description="Explora guías para desarrollar en Stacks."
+ />
+
+
+
+
+
+ }
+ href="/tools/clarinet"
+ title="Clarinet"
+ description="Un entorno de desarrollo integral para construir y probar contratos inteligentes de Clarity."
+ />
+
+ }
+ href="/tools/chainhook"
+ title="Chainhook"
+ description="Crea flujos de eventos personalizados y desencadenantes para el procesamiento de datos de blockchain en tiempo real."
+ />
+
+ }
+ href="/tools/contract-monitoring"
+ title="Monitoreo de Contratos"
+ description="Monitorear y rastrear la actividad de contratos inteligentes y las métricas de rendimiento."
+ />
+
+ }
+ href="/tools/bitcoin-indexer"
+ title="Indexador de Bitcoin"
+ description="Indexa y consulta datos de la cadena de bloques de Bitcoin con indexación de alto rendimiento."
+ />
+
+
+
+
+
+
+ }
+ href="/apis/stacks-blockchain-api"
+ title="API de la cadena de bloques Stacks"
+ description="API REST completa para interactuar con la cadena de bloques Stacks y los datos de la red."
+ />
+
+ }
+ href="/apis/token-metadata-api"
+ title="API de Metadatos de Tokens"
+ description="Metadatos rápidos y confiables para tokens fungibles y no fungibles en Stacks."
+ />
+
+ }
+ href="/apis/platform-api"
+ title="API de la plataforma"
+ description="Administre programáticamente devnets y chainhooks a través de la interfaz REST."
+ />
+
+ }
+ href="/apis/ordinals-api"
+ title="API de Ordinales"
+ description="Datos completos de ordinales de Bitcoin y tokens BRC-20 con optimización de caché."
+ />
+
+ }
+ href="/apis/runes-api"
+ title="API de Runas"
+ description="Datos rápidos y confiables para Bitcoin Runes a través de una interfaz REST fácil de usar."
+ />
+
+ }
+ href="/apis/signer-metrics-api"
+ title="API de Métricas de Firmantes"
+ description="Monitorear y analizar el comportamiento y rendimiento de los firmantes en la red Stacks."
+ />
+
+
+
+
+
+
+ }
+ href="/reference/stacks.js"
+ title="Stacks.js"
+ description="SDK de JavaScript para construir aplicaciones en Stacks con transacciones, utilidades de red e integración de billetera."
+ />
+
+ }
+ href="/tools/clarinet/sdk-introduction"
+ title="SDK de Clarinet JS"
+ description="SDK de JavaScript para probar e interactuar con contratos inteligentes de Clarity en entornos simulados."
+ />
+
+ {/* }
+ href="/reference/stacks-blockchain-api"
+ title="Stacks Blockchain API Client"
+ description="Type-safe JavaScript client library for interacting with the Stacks Blockchain API."
+ /> */}
+
+
+
+
+
+
+ }
+ href="/resources/clarity"
+ title="Referencia de Claridad"
+ description="Guías completas y referencia de funciones para el lenguaje de contratos inteligentes Clarity."
+ />
+
+ }
+ href="/resources/archive"
+ title="Archivo Hiro"
+ description="Instantáneas de datos para iniciar rápidamente servicios del ecosistema Stacks con datos precargados."
+ />
+
+
+
+
+
+ );
+}
diff --git a/app/apis/page.tsx b/app/[locale]/(home)/apis/_pages/page.en.tsx
similarity index 88%
rename from app/apis/page.tsx
rename to app/[locale]/(home)/apis/_pages/page.en.tsx
index ea6c64077..61fff8141 100644
--- a/app/apis/page.tsx
+++ b/app/[locale]/(home)/apis/_pages/page.en.tsx
@@ -17,6 +17,12 @@ export default function APIsPage() {
title="Stacks Blockchain API"
description="Comprehensive REST API for interacting with the Stacks blockchain and network data."
/>
+ }
+ href="/apis/stacks-node-rpc-api"
+ title="Stacks Node RPC API"
+ description="Raw blockchain node methods: submit txs, call read-only contracts, query mempool/state."
+ />
}
href="/apis/token-metadata-api"
diff --git a/app/[locale]/(home)/apis/_pages/page.es.tsx b/app/[locale]/(home)/apis/_pages/page.es.tsx
new file mode 100644
index 000000000..82e0bb19a
--- /dev/null
+++ b/app/[locale]/(home)/apis/_pages/page.es.tsx
@@ -0,0 +1,69 @@
+import { Cards, IndexCard } from '@/components/card';
+import { API, Hiro, Ordinals, Runes, StacksIcon } from '@/components/ui/icon';
+
+export default function APIsPage() {
+ return (
+
+
+
+
+
APIs
+
+
+
+ }
+ href="/apis/stacks-blockchain-api"
+ title="API de la cadena de bloques Stacks"
+ description="API REST completa para interactuar con la cadena de bloques de Stacks y los datos de la red."
+ />
+
+ }
+ href="/apis/stacks-node-rpc-api"
+ title="API RPC del Nodo Stacks"
+ description="Métodos de nodo de blockchain sin procesar: enviar transacciones, llamar contratos de solo lectura, consultar mempool/estado."
+ />
+
+ }
+ href="/apis/token-metadata-api"
+ title="API de Metadatos de Tokens"
+ description="Metadatos rápidos y confiables para tokens fungibles y no fungibles en Stacks."
+ />
+
+ }
+ href="/apis/platform-api"
+ title="API de la plataforma"
+ description="Gestione programáticamente devnets y chainhooks a través de la interfaz REST."
+ />
+
+ }
+ href="/apis/ordinals-api"
+ title="API de Ordinals"
+ tag="Bitcoin L1"
+ description="Datos completos de ordinales de Bitcoin y tokens BRC-20 con optimización de caché."
+ />
+
+ }
+ href="/apis/runes-api"
+ title="API de Runas"
+ tag="Bitcoin L1"
+ description="Datos rápidos y confiables para Bitcoin Runes a través de una interfaz REST fácil de usar."
+ />
+
+ }
+ href="/apis/signer-metrics-api"
+ title="API de Métricas del Firmante"
+ description="Monitorea y analiza el comportamiento y rendimiento de los firmantes en la red Stacks."
+ />
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(home)/apis/page.tsx b/app/[locale]/(home)/apis/page.tsx
new file mode 100644
index 000000000..4a2d8e985
--- /dev/null
+++ b/app/[locale]/(home)/apis/page.tsx
@@ -0,0 +1,14 @@
+export default async function APIsPage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+
+ // Dynamically import the locale-specific page
+ try {
+ const LocalePage = (await import(`./_pages/page.${locale}`)).default;
+ return ;
+ } catch (error) {
+ // Fallback to English if locale file doesn't exist
+ console.log(`No ${locale} translation found for APIs page, falling back to English`);
+ const EnglishPage = (await import('./_pages/page.en')).default;
+ return ;
+ }
+}
diff --git a/app/(home)/layout.tsx b/app/[locale]/(home)/layout.tsx
similarity index 100%
rename from app/(home)/layout.tsx
rename to app/[locale]/(home)/layout.tsx
diff --git a/app/[locale]/(home)/page.tsx b/app/[locale]/(home)/page.tsx
new file mode 100644
index 000000000..1ab91e950
--- /dev/null
+++ b/app/[locale]/(home)/page.tsx
@@ -0,0 +1,14 @@
+export default async function HomePage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+
+ // Dynamically import the locale-specific page
+ try {
+ const LocalePage = (await import(`./_pages/page.${locale}`)).default;
+ return ;
+ } catch (error) {
+ // Fallback to English if locale file doesn't exist
+ console.log(`No ${locale} translation found for home page, falling back to English`);
+ const EnglishPage = (await import('./_pages/page.en')).default;
+ return ;
+ }
+}
diff --git a/app/reference/page.tsx b/app/[locale]/(home)/reference/_pages/page.en.tsx
similarity index 100%
rename from app/reference/page.tsx
rename to app/[locale]/(home)/reference/_pages/page.en.tsx
diff --git a/app/[locale]/(home)/reference/_pages/page.es.tsx b/app/[locale]/(home)/reference/_pages/page.es.tsx
new file mode 100644
index 000000000..c7a13e3cb
--- /dev/null
+++ b/app/[locale]/(home)/reference/_pages/page.es.tsx
@@ -0,0 +1,46 @@
+import { Cards, IndexCard } from '@/components/card';
+import { Js } from '@/components/ui/icon';
+
+export default function ReferencePage() {
+ return (
+
+
+
+
+
Bibliotecas y SDKs
+
+
+
+ }
+ href="/reference/stacks.js"
+ title="Stacks.js"
+ description="SDK de JavaScript para construir aplicaciones en Stacks con transacciones, utilidades de red e integración de billetera."
+ />
+
+ }
+ href="/tools/clarinet/sdk-introduction"
+ title="SDK de Clarinet JS"
+ description="SDK de JavaScript para probar e interactuar con contratos inteligentes de Clarity en entornos simulados."
+ />
+
+ }
+ href="/tools/clarinet/browser-sdk-reference"
+ title="Clarinet JS SDK para navegador"
+ description="SDK de JavaScript para interactuar con la simnet en navegadores web."
+ />
+
+ {/* }
+ href="/reference/stacks-blockchain-api"
+ title="Stacks Blockchain API Client"
+ description="Type-safe JavaScript client library for interacting with the Stacks Blockchain API."
+ /> */}
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(home)/reference/page.tsx b/app/[locale]/(home)/reference/page.tsx
new file mode 100644
index 000000000..76484aeae
--- /dev/null
+++ b/app/[locale]/(home)/reference/page.tsx
@@ -0,0 +1,14 @@
+export default async function ReferencePage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+
+ // Dynamically import the locale-specific page
+ try {
+ const LocalePage = (await import(`./_pages/page.${locale}`)).default;
+ return ;
+ } catch (error) {
+ // Fallback to English if locale file doesn't exist
+ console.log(`No ${locale} translation found for reference page, falling back to English`);
+ const EnglishPage = (await import('./_pages/page.en')).default;
+ return ;
+ }
+}
diff --git a/app/resources/page.tsx b/app/[locale]/(home)/resources/_pages/page.en.tsx
similarity index 100%
rename from app/resources/page.tsx
rename to app/[locale]/(home)/resources/_pages/page.en.tsx
diff --git a/app/[locale]/(home)/resources/_pages/page.es.tsx b/app/[locale]/(home)/resources/_pages/page.es.tsx
new file mode 100644
index 000000000..a234efd20
--- /dev/null
+++ b/app/[locale]/(home)/resources/_pages/page.es.tsx
@@ -0,0 +1,53 @@
+import { Code, Database, Terminal } from 'lucide-react';
+import { Cards, IndexCard } from '@/components/card';
+import { Clarity } from '@/components/ui/icon';
+
+export default function ResourcesPage() {
+ return (
+
+
+
+
+
Recursos
+
+
+
+ }
+ href="/resources/clarity"
+ title="Referencia de Clarity"
+ description="Guías completas y referencia de funciones para el lenguaje de contratos inteligentes Clarity."
+ />
+
+ }
+ href="/resources/guides"
+ title="Guías"
+ description="Guías para desarrollar en Stacks y Bitcoin."
+ />
+
+ {/* }
+ href="/resources/templates"
+ title="Project templates"
+ description="Project templates for building on Stacks and Bitcoin."
+ /> */}
+ }
+ href="/resources/snippets"
+ title="Fragmentos"
+ description="Fragmentos de código para construir en Stacks y Bitcoin."
+ />
+
+ }
+ href="/resources/archive"
+ title="Archivo Hiro"
+ description="Instantáneas de datos para iniciar rápidamente servicios del ecosistema Stacks con datos precargados."
+ />
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(home)/resources/page.tsx b/app/[locale]/(home)/resources/page.tsx
new file mode 100644
index 000000000..5beac117e
--- /dev/null
+++ b/app/[locale]/(home)/resources/page.tsx
@@ -0,0 +1,14 @@
+export default async function ResourcesPage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+
+ // Dynamically import the locale-specific page
+ try {
+ const LocalePage = (await import(`./_pages/page.${locale}`)).default;
+ return ;
+ } catch (error) {
+ // Fallback to English if locale file doesn't exist
+ console.log(`No ${locale} translation found for resources page, falling back to English`);
+ const EnglishPage = (await import('./_pages/page.en')).default;
+ return ;
+ }
+}
diff --git a/app/tools/page.tsx b/app/[locale]/(home)/tools/_pages/page.en.tsx
similarity index 100%
rename from app/tools/page.tsx
rename to app/[locale]/(home)/tools/_pages/page.en.tsx
diff --git a/app/[locale]/(home)/tools/_pages/page.es.tsx b/app/[locale]/(home)/tools/_pages/page.es.tsx
new file mode 100644
index 000000000..a930cee29
--- /dev/null
+++ b/app/[locale]/(home)/tools/_pages/page.es.tsx
@@ -0,0 +1,48 @@
+import { Brackets, Database } from 'lucide-react';
+import { Cards, IndexCard } from '@/components/card';
+import { Chainhook, Clarinet } from '@/components/ui/icon';
+
+export default function ToolsPage() {
+ return (
+
+
+
+
+
Herramientas
+
+
+
+ }
+ description="Un entorno de desarrollo integral para construir y probar contratos inteligentes de Clarity."
+ />
+
+ }
+ description="Crea flujos de eventos personalizados y desencadenantes para el procesamiento de datos de blockchain en tiempo real."
+ />
+
+ }
+ description="Monitorea y rastrea la actividad de contratos inteligentes y las métricas de rendimiento."
+ />
+
+ }
+ tag="Bitcoin L1"
+ description="Indexa y consulta datos de la cadena de bloques de Bitcoin con indexación de alto rendimiento."
+ />
+
+
+
+
+ );
+}
diff --git a/app/[locale]/(home)/tools/page.tsx b/app/[locale]/(home)/tools/page.tsx
new file mode 100644
index 000000000..36e24bf1b
--- /dev/null
+++ b/app/[locale]/(home)/tools/page.tsx
@@ -0,0 +1,14 @@
+export default async function ToolsPage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+
+ // Dynamically import the locale-specific page
+ try {
+ const LocalePage = (await import(`./_pages/page.${locale}`)).default;
+ return ;
+ } catch (error) {
+ // Fallback to English if locale file doesn't exist
+ console.log(`No ${locale} translation found for tools page, falling back to English`);
+ const EnglishPage = (await import('./_pages/page.en')).default;
+ return ;
+ }
+}
diff --git a/app/(docs)/layout.tsx b/app/[locale]/[...slug]/layout.tsx
similarity index 100%
rename from app/(docs)/layout.tsx
rename to app/[locale]/[...slug]/layout.tsx
diff --git a/app/(docs)/[...slug]/page.tsx b/app/[locale]/[...slug]/page.tsx
similarity index 86%
rename from app/(docs)/[...slug]/page.tsx
rename to app/[locale]/[...slug]/page.tsx
index bce4398b3..5364fb4f7 100644
--- a/app/(docs)/[...slug]/page.tsx
+++ b/app/[locale]/[...slug]/page.tsx
@@ -26,12 +26,25 @@ import { API } from '@/components/reference/api-page';
import { Badge } from '@/components/ui/badge';
import * as customIcons from '@/components/ui/icon';
import { TagFilterSystem } from '@/components/ui/tag-filter-system';
+import { i18n } from '@/lib/i18n';
import { getAllFilterablePages, source } from '@/lib/source';
import type { HeadingProps } from '@/types';
-export default async function Page(props: { params: Promise<{ slug?: string[] }> }) {
+export default async function Page(props: {
+ params: Promise<{
+ locale: string;
+ slug: string[];
+ }>;
+}) {
const params = await props.params;
- const page = source.getPage(params.slug);
+ const { locale, slug } = params;
+
+ // The source includes 'en' in the slug path, so we need to prepend it
+ const fullSlug = [locale, ...slug];
+
+ // Get the page with the locale prepended
+ const page = source.getPage(fullSlug);
+
if (!page) notFound();
const fileContent = await fs.readFile(page.data._file.absolutePath, 'utf-8');
@@ -201,6 +214,15 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }>
+ {/* RPC endpoint callout */}
+ {page.data.isRpc && (
+
+ These are served by Stacks nodes, not directly operated by Hiro. Availability and
+ performance may vary depending on upstream node health. For guaranteed
+ performance, run your own node or talk to us about dedicated options.
+
+ )}
+
{/* Render TagFilterSystem if tags are present in frontmatter */}
{page.data.tags && page.data.tags.length > 0 && (
}
export async function generateStaticParams() {
- return source.generateParams().filter(
- (params) =>
- // Filter out empty slug arrays (root path)
- params.slug && params.slug.length > 0,
- );
+ const { languages, defaultLanguage } = i18n;
+
+ // Generate params for all locales and slugs
+ const slugParams = source
+ .generateParams()
+ .filter((params) => params.slug && params.slug.length > 0);
+
+ const allParams = [];
+
+ for (const params of slugParams) {
+ const [sourceLocale, ...restSlug] = params.slug;
+
+ // Generate for all configured locales
+ if (sourceLocale === defaultLanguage) {
+ for (const locale of languages) {
+ allParams.push({
+ locale,
+ slug: restSlug,
+ });
+ }
+ }
+ }
+
+ return allParams;
}
-export async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {
+export async function generateMetadata(props: {
+ params: Promise<{
+ locale: string;
+ slug: string[];
+ }>;
+}) {
const params = await props.params;
- const page = source.getPage(params.slug);
+ const { locale, slug } = params;
+ // The source includes [locale] in the slug path, so we need to prepend it
+ const fullSlug = [locale, ...slug];
+ const page = source.getPage(fullSlug);
if (!page) notFound();
return {
diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx
new file mode 100644
index 000000000..9f09e13db
--- /dev/null
+++ b/app/[locale]/layout.tsx
@@ -0,0 +1,31 @@
+import { I18nProvider } from 'fumadocs-ui/i18n';
+import type { ReactNode } from 'react';
+import { i18n, languageNames } from '@/lib/i18n';
+
+interface LocaleLayoutProps {
+ children: ReactNode;
+ params: Promise<{
+ locale: string;
+ }>;
+}
+
+export default async function LocaleLayout({ children, params }: LocaleLayoutProps) {
+ const { locale } = await params;
+
+ // Convert language strings to LocaleItem objects
+ const locales = i18n.languages.map((lang) => ({
+ name: languageNames[lang],
+ locale: lang,
+ }));
+
+ return (
+
+ {children}
+
+ );
+}
+
+// Generate static params for the locales
+export async function generateStaticParams() {
+ return [{ locale: 'en' }, { locale: 'es' }];
+}
diff --git a/app/api/search/route.ts b/app/api/search/route.ts
index 0fdb189a1..206137ed8 100644
--- a/app/api/search/route.ts
+++ b/app/api/search/route.ts
@@ -1,7 +1,36 @@
import { createFromSource } from 'fumadocs-core/search/server';
+import { getLocaleFromRequest } from '@/lib/locale-utils';
import { source } from '@/lib/source';
// Cache the search API responses at runtime for optimal performance
export const revalidate = false;
-export const { GET } = createFromSource(source);
+const { GET: originalGET } = createFromSource(source);
+
+export async function GET(request: Request) {
+ const url = new URL(request.url);
+ const query = url.searchParams.get('query');
+
+ // Detect current locale from request
+ const currentLocale = getLocaleFromRequest(request);
+
+ // Get original search results
+ const response = await originalGET(request);
+ const data = await response.json();
+
+ if (Array.isArray(data)) {
+ // Filter results to only include pages matching the current locale
+ const filteredResults = data.filter((result: any) => {
+ const url = result.url || '';
+ const isMatchingLocale =
+ url.startsWith(`/${currentLocale}/`) || url.includes(`/${currentLocale}/`);
+ return isMatchingLocale;
+ });
+
+ return new Response(JSON.stringify(filteredResults), {
+ headers: { 'Content-Type': 'application/json' },
+ });
+ }
+
+ return response;
+}
diff --git a/app/apis/layout.tsx b/app/apis/layout.tsx
deleted file mode 100644
index 5b9820521..000000000
--- a/app/apis/layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { ReactNode } from 'react';
-import { baseOptions } from '@/app/layout.config';
-import { HomeLayout } from '@/components/layouts/home';
-
-export default function Layout({ children }: { children: ReactNode }) {
- return {children} ;
-}
diff --git a/app/config/docs.ts b/app/config/docs.ts
deleted file mode 100644
index 5a84adf90..000000000
--- a/app/config/docs.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import type { MainNavItem, SidebarNavItem } from '@/types/nav';
-
-interface DocsConfig {
- mainNav: MainNavItem[];
- sidebarNav: SidebarNavItem[];
-}
-
-export const docsConfig: DocsConfig = {
- mainNav: [
- // {
- // title: "Documentation",
- // href: "/docs",
- // },
- // {
- // title: "Cookbook",
- // href: "/cookbook",
- // },
- // {
- // title: "GitHub",
- // href: "https://github.com/example/repo", // Example external link
- // external: true,
- // },
- ],
- sidebarNav: [
- // {
- // title: "Getting Started",
- // items: [
- // {
- // title: "Introduction",
- // href: "/docs/introduction",
- // },
- // {
- // title: "Installation",
- // href: "/docs/installation",
- // },
- // ],
- // },
- // {
- // title: "Core Concepts",
- // items: [
- // {
- // title: "Concept A",
- // href: "/docs/concepts/a",
- // },
- // {
- // title: "Concept B",
- // href: "/docs/concepts/b",
- // },
- // ],
- // },
- // Add more sidebar groups as needed
- ],
-};
diff --git a/app/layout.config.tsx b/app/layout.config.tsx
index 3ca9397b5..854775cbf 100644
--- a/app/layout.config.tsx
+++ b/app/layout.config.tsx
@@ -68,6 +68,12 @@ export const baseOptions: BaseLayoutProps = {
description: 'RESTful API for accessing Stacks blockchain data and functionality.',
url: '/apis/stacks-blockchain-api',
},
+ {
+ text: 'Stacks RPC Node API',
+ description:
+ 'Raw blockchain node methods: submit txs, call read-only contracts, query mempool/state.',
+ url: '/apis/stacks-node-rpc-api',
+ },
{
text: 'Token Metadata API',
description: 'API for retrieving NFT and fungible token metadata.',
diff --git a/app/layout.tsx b/app/layout.tsx
index 0e14614e8..598c17358 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -2,9 +2,7 @@ import './global.css';
import { RootProvider } from 'fumadocs-ui/provider';
import type { ReactNode } from 'react';
import { aeonik, aeonikFono, aeonikMono, inter } from '@/fonts';
-// import SearchDialog from "@/components/search-dialog";
import { KeyboardShortcutsProvider } from '@/hooks/use-keyboard-shortcuts';
-import { SearchProvider } from '@/hooks/use-search';
import { QueryProvider } from '@/providers/query-provider';
export default function RootLayout({ children }: { children: ReactNode }) {
@@ -17,16 +15,13 @@ export default function RootLayout({ children }: { children: ReactNode }) {
-
-
- {children}
-
- {/* TODO: this is new new dialog */}
-
+
+ {children}
+
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 000000000..915fdd85e
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,5 @@
+import { redirect } from 'next/navigation';
+
+export default function RootPage() {
+ redirect('/en');
+}
diff --git a/app/reference/layout.tsx b/app/reference/layout.tsx
deleted file mode 100644
index 5b9820521..000000000
--- a/app/reference/layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { ReactNode } from 'react';
-import { baseOptions } from '@/app/layout.config';
-import { HomeLayout } from '@/components/layouts/home';
-
-export default function Layout({ children }: { children: ReactNode }) {
- return {children} ;
-}
diff --git a/app/resources/layout.tsx b/app/resources/layout.tsx
deleted file mode 100644
index 5b9820521..000000000
--- a/app/resources/layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { ReactNode } from 'react';
-import { baseOptions } from '@/app/layout.config';
-import { HomeLayout } from '@/components/layouts/home';
-
-export default function Layout({ children }: { children: ReactNode }) {
- return {children} ;
-}
diff --git a/app/tools/layout.tsx b/app/tools/layout.tsx
deleted file mode 100644
index 5b9820521..000000000
--- a/app/tools/layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { ReactNode } from 'react';
-import { baseOptions } from '@/app/layout.config';
-import { HomeLayout } from '@/components/layouts/home';
-
-export default function Layout({ children }: { children: ReactNode }) {
- return {children} ;
-}
diff --git a/components/card.tsx b/components/card.tsx
index a8f235ea1..ef7543fe6 100644
--- a/components/card.tsx
+++ b/components/card.tsx
@@ -1,8 +1,8 @@
import Link, { type LinkProps } from 'fumadocs-core/link';
import { ChevronRight } from 'lucide-react';
import type { HTMLAttributes, ReactNode } from 'react';
-import { InteractiveBadge } from '@/app/(home)/components/interactive-badge';
import { CopyButton } from '@/components/docskit/copy-button';
+import { InteractiveBadge } from '@/components/interactive-badge';
import { Badge } from '@/components/ui/badge';
import { cn } from '@/lib/utils';
diff --git a/components/feedback/feedback-wrapper.tsx b/components/feedback/feedback-wrapper.tsx
index acaadce79..dcce08ca0 100644
--- a/components/feedback/feedback-wrapper.tsx
+++ b/components/feedback/feedback-wrapper.tsx
@@ -2,6 +2,7 @@
import { ThumbsDown, ThumbsUp } from 'lucide-react';
import { useCallback, useState } from 'react';
+import { useTranslations } from '@/hooks/use-translations';
import { cn } from '@/lib/utils';
import type { FeedbackResponse } from '@/types/feedback';
@@ -12,6 +13,7 @@ interface FeedbackWrapperProps {
}
export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrapperProps) {
+ const t = useTranslations();
const [feedback, setFeedback] = useState<'helpful' | 'not-helpful' | null>(null);
const [isSubmitting, setIsSubmitting] = useState(false);
const [showTextarea, setShowTextarea] = useState(false);
@@ -95,7 +97,7 @@ export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrap
return (
-
How is this guide?
+
{t.navigation.feedback.question}
{showTextarea ? (
@@ -113,7 +115,7 @@ export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrap
)}
>
- Good
+ {t.navigation.feedback.good}
- Bad
+ {t.navigation.feedback.bad}
) : !feedback ? (
@@ -146,7 +148,7 @@ export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrap
)}
>
-
Good
+
{t.navigation.feedback.good}
- Bad
+ {t.navigation.feedback.bad}
) : null}
@@ -169,7 +171,7 @@ export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrap
{feedback && !showTextarea && (
@@ -189,7 +191,7 @@ export function FeedbackWrapper({ pageTitle, pagePath, className }: FeedbackWrap
diff --git a/app/(home)/components/interactive-badge.tsx b/components/interactive-badge.tsx
similarity index 100%
rename from app/(home)/components/interactive-badge.tsx
rename to components/interactive-badge.tsx
diff --git a/components/language-switcher.tsx b/components/language-switcher.tsx
new file mode 100644
index 000000000..9d5aebba4
--- /dev/null
+++ b/components/language-switcher.tsx
@@ -0,0 +1,102 @@
+'use client';
+
+import { ChevronDown } from 'lucide-react';
+import { usePathname, useRouter } from 'next/navigation';
+import { useEffect, useState } from 'react';
+import { Button } from '@/components/ui/button';
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from '@/components/ui/dropdown-menu';
+import { i18n, languageAbbreviations, languageNames, localizedLanguageNames } from '@/lib/i18n';
+
+export function LanguageSwitcher() {
+ const router = useRouter();
+ const pathname = usePathname();
+ const [currentLang, setCurrentLang] = useState(i18n.defaultLanguage);
+
+ useEffect(() => {
+ // Get current language from cookie or detect from path
+ const getCookieLocale = () => {
+ const match = document.cookie.match(/(?:^|; )locale=([^;]*)/);
+ return match ? match[1] : null;
+ };
+
+ const cookieLocale = getCookieLocale();
+
+ // Check if path has locale prefix
+ const segments = pathname.split('/').filter(Boolean);
+ const pathLocale = i18n.languages.includes(segments[0]) ? segments[0] : null;
+
+ // Use path locale first (matches middleware logic), then cookie, then default
+ const detectedLocale = pathLocale || cookieLocale || i18n.defaultLanguage;
+ setCurrentLang(detectedLocale);
+
+ // Sync cookie with path locale if they differ
+ if (pathLocale && pathLocale !== cookieLocale) {
+ document.cookie = `locale=${pathLocale}; max-age=${60 * 60 * 24 * 365}; path=/; samesite=lax`;
+ }
+ }, [pathname]);
+
+ const handleLanguageChange = (newLang: string) => {
+ // Set cookie for the new language
+ document.cookie = `locale=${newLang}; max-age=${60 * 60 * 24 * 365}; path=/; samesite=lax`;
+
+ // Parse current path to get the clean path without locale
+ const segments = pathname.split('/').filter(Boolean);
+
+ // Check if first segment is a locale
+ let cleanPath: string;
+ if (i18n.languages.includes(segments[0])) {
+ // Remove the locale prefix
+ cleanPath = '/' + segments.slice(1).join('/');
+ } else {
+ // Path doesn't have locale prefix (shouldn't happen with our setup)
+ cleanPath = pathname;
+ }
+
+ // Build new path with new locale
+ const newPath = `/${newLang}${cleanPath}`;
+
+ // Navigate to the new path
+ router.push(newPath);
+ router.refresh();
+ };
+
+ return (
+
+
+
+ {languageAbbreviations[currentLang]}
+
+
+
+
+ {Object.entries(languageNames).map(([code, name]) => {
+ // Only show languages that are configured
+ if (!i18n.languages.includes(code)) return null;
+
+ // Get the localized name for this language in the current language
+ const localizedName = localizedLanguageNames[code]?.[currentLang] || name;
+
+ return (
+ handleLanguageChange(code)}
+ className="gap-3 font-sans text-sm"
+ >
+ {localizedName}
+ {code === currentLang && ✓ }
+
+ );
+ })}
+
+
+ );
+}
diff --git a/components/layout/mobile-navigation.tsx b/components/layout/mobile-navigation.tsx
index 0d0557701..681df75c0 100644
--- a/components/layout/mobile-navigation.tsx
+++ b/components/layout/mobile-navigation.tsx
@@ -262,7 +262,7 @@ export function MobileNavigation({ isOpen = false, onClose, tree }: MobileNaviga
) : isInDocsContext && !showMainMenu ? (
-
diff --git a/components/layout/search-toggle.tsx b/components/layout/search-toggle.tsx
index 5f4125ff4..6d44651a8 100644
--- a/components/layout/search-toggle.tsx
+++ b/components/layout/search-toggle.tsx
@@ -3,11 +3,13 @@ import { useI18n } from 'fumadocs-ui/contexts/i18n';
import { useSearchContext } from 'fumadocs-ui/contexts/search';
import { Search, SearchIcon } from 'lucide-react';
import type { ComponentProps } from 'react';
+import { useTranslations } from '@/hooks/use-translations';
import { cn } from '@/lib/utils';
import { Kbd } from '../ui/kbd';
export function SearchToggle(props: ComponentProps<'button'>) {
const { enabled, setOpenSearch } = useSearchContext();
+ const t = useTranslations();
if (!enabled) return;
return (
@@ -16,7 +18,7 @@ export function SearchToggle(props: ComponentProps<'button'>) {
setOpenSearch(true)}
- aria-label="Search"
+ aria-label={t.navigation.searchAriaLabel}
{...props}
>
@@ -31,7 +33,7 @@ export function SearchToggle(props: ComponentProps<'button'>) {
- Search
+ {t.navigation.search}
diff --git a/components/layouts/docs.tsx b/components/layouts/docs.tsx
index 9d3f63343..90628a8b2 100644
--- a/components/layouts/docs.tsx
+++ b/components/layouts/docs.tsx
@@ -9,8 +9,11 @@ import { TreeContextProvider, useTreeContext } from 'fumadocs-ui/contexts/tree';
import { ArrowUpRight, ChevronDown, ChevronRight, SidebarIcon } from 'lucide-react';
import React, { type ButtonHTMLAttributes, type ReactNode, useMemo } from 'react';
import { baseOptions } from '@/app/layout.config';
+import { LanguageSwitcher } from '@/components/language-switcher';
import { MobileMenuProvider } from '@/contexts/mobile-menu';
import { useKeyboardShortcuts } from '@/hooks/use-keyboard-shortcuts';
+import { useLocalizedNavigation } from '@/hooks/use-localized-navigation';
+import { useTranslations } from '@/hooks/use-translations';
import { cn } from '@/lib/utils';
import { MobileMenuButton } from '../layout/mobile-menu-button';
import { SearchToggle } from '../layout/search-toggle';
@@ -30,6 +33,8 @@ export function DocsLayout({ tree, children }: DocsLayoutProps) {
const [isScrolled, setIsScrolled] = React.useState(false);
const { registerShortcut } = useKeyboardShortcuts();
const { collapsed } = useSidebar();
+ const localizedLinks = useLocalizedNavigation();
+ const t = useTranslations();
React.useEffect(() => {
const handleScroll = () => {
@@ -98,19 +103,20 @@ export function DocsLayout({ tree, children }: DocsLayoutProps) {
- {baseOptions.links?.map((link) => renderNavItem(link))}
+ {localizedLinks?.map((link) => renderNavItem(link))}
+
- Sign in
+ {t.navigation.signIn}
@@ -199,7 +205,7 @@ export function Sidebar() {
- {baseOptions.links?.map((link) => renderNavItem(link))}
+ {localizedLinks?.map((link) => renderNavItem(link))}
+
- Sign in
+ {t.navigation.signIn}
diff --git a/components/layouts/page.tsx b/components/layouts/page.tsx
index 5b2f5ab20..2b76aab3f 100644
--- a/components/layouts/page.tsx
+++ b/components/layouts/page.tsx
@@ -13,6 +13,7 @@ import React, {
} from 'react';
import { BreadcrumbNav as OriginalBreadcrumb } from '@/components/breadcrumb-nav';
import { TocThumb } from '@/components/layout/toc-thumb';
+import { useTranslations } from '@/hooks/use-translations';
import { cn } from '@/lib/utils';
export interface PageData {
@@ -155,6 +156,7 @@ function TocItem({ item }: { item: TOCItemType }) {
function PageTOC() {
const { toc = [], full } = usePageData();
const containerRef = useRef
(null);
+ const t = useTranslations();
if (toc.length === 0 || full) return null;
@@ -162,7 +164,7 @@ function PageTOC() {
-
Contents
+
{t.navigation.toc.contents}
[
{
name: 'ChatGPT',
url: 'https://chat.openai.com',
icon: OpenAIIcon,
- description: 'Ask questions about this page',
+ description: t.navigation.llmShare.askQuestions,
},
{
name: 'Claude',
url: 'https://claude.ai',
icon: ClaudeIcon,
- description: 'Ask questions about this page',
+ description: t.navigation.llmShare.askQuestions,
},
];
@@ -39,6 +40,8 @@ export function LLMShare({ content }: LLMShareProps) {
const pathname = usePathname();
const markdownUrl = useCurrentPageMarkdown();
const { refetch } = useLLMsTxt();
+ const t = useTranslations();
+ const llmProviders = getLLMProviders(t);
const handleCopy = async () => {
try {
@@ -67,22 +70,7 @@ export function LLMShare({ content }: LLMShareProps) {
}
};
- const handleViewRawMarkdown = () => {
- if (!pathname) return;
-
- let mdPath = pathname;
- if (mdPath.startsWith('/docs')) {
- mdPath = mdPath.substring(5);
- }
-
- if (!mdPath || mdPath === '/') {
- mdPath = '/index';
- }
-
- window.open(`${mdPath}.md`, '_blank');
- };
-
- const handleShare = async (provider: (typeof LLM_PROVIDERS)[number]) => {
+ const handleShare = async (provider: ReturnType[number]) => {
try {
const instruction = `Read from ${markdownUrl} so I can ask questions about it.`;
@@ -108,7 +96,7 @@ export function LLMShare({ content }: LLMShareProps) {
onClick={handleCopy}
type="button"
className="cursor-pointer relative inline-flex items-center gap-2 rounded-l-md rounded-r-none px-2 py-1.5 text-sm font-fono focus:z-10 border-0 shadow-none transition-all duration-150 hover:bg-neutral-150 dark:hover:bg-neutral-700"
- aria-label="Copy markdown to clipboard"
+ aria-label={t.navigation.llmShare.copyMarkdown}
>
{isCopied ? : }
- Copy markdown
+ {t.navigation.llmShare.copyMarkdown}
@@ -132,16 +120,7 @@ export function LLMShare({ content }: LLMShareProps) {
-
-
-
-
- View as Markdown
-
-
-
-
- {LLM_PROVIDERS.map((provider) => (
+ {llmProviders.map((provider) => (
handleShare(provider)}
@@ -150,7 +129,9 @@ export function LLMShare({ content }: LLMShareProps) {
-
Open in {provider.name}
+
+ {t.navigation.llmShare.openIn} {provider.name}
+
diff --git a/content/_hidden/(ai-integration)/prompts/meta.json b/content/_hidden/(ai-integration)/prompts/meta.json
deleted file mode 100644
index da461f4d0..000000000
--- a/content/_hidden/(ai-integration)/prompts/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "AI prompts",
- "pages": ["..."]
-}
diff --git a/content/_hidden/(ai-integration)/prompts/react-app-with-connect.mdx b/content/_hidden/(ai-integration)/prompts/react-app-with-connect.mdx
deleted file mode 100644
index e6743cec7..000000000
--- a/content/_hidden/(ai-integration)/prompts/react-app-with-connect.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "AI Prompt: React app with Connect"
-description: Use this prompt to create a React app with Connect.
----
-
-## Prompts: React app with Connect
\ No newline at end of file
diff --git a/content/_hidden/(building-frontend-applications)/interacting-with-smart-contracts.mdx b/content/_hidden/(building-frontend-applications)/interacting-with-smart-contracts.mdx
deleted file mode 100644
index 24d05d044..000000000
--- a/content/_hidden/(building-frontend-applications)/interacting-with-smart-contracts.mdx
+++ /dev/null
@@ -1,1324 +0,0 @@
----
-title: Interacting with smart contracts
-description: Build advanced dApp functionality with complex contract interactions, security constraints, and token operations through wallet integration
----
-
-Smart contract interaction is where your dApp comes alive. Users can call contract functions, transfer tokens, and execute complex blockchain operations directly from your frontend.
-
-This guide takes you beyond basic wallet integration to build sophisticated contract interactions with security constraints, token operations, and advanced transaction patterns.
-
-## What you'll learn
-
-You'll master advanced contract interaction patterns:
-- Secure contract calls with post conditions
-- SIP-010 fungible token operations
-- SIP-009 NFT transfers and marketplace interactions
-- Multi-step transaction workflows
-- Message signing for authentication and verification
-- Complex Clarity value construction
-- Wallet compatibility strategies
-
-## Prerequisites
-
-Before diving in, make sure you have:
-- Completed [Wallet Integration](/docs/building-frontend-applications/wallet-integration) guide
-- A connected Stacks wallet with testnet STX
-- [Node.js and npm](https://nodejs.org/) installed
-- Basic understanding of [Clarity smart contracts](/docs/clarinet/getting-started)
-
-## Step 1: Set up advanced contract interactions
-
-Install the required dependencies and set up your environment:
-
-```bash
-npm install @stacks/connect@latest @stacks/transactions
-```
-
-Create a contract interaction utility with enhanced error handling:
-
-```typescript
-import { request } from '@stacks/connect';
-import { Cl, cvToValue, hexToCV } from '@stacks/transactions';
-
-// Enhanced contract interaction with retry logic
-export class ContractInteraction {
- private maxRetries = 3;
- private retryDelay = 1000;
-
- async callContractFunction(
- contractAddress: string,
- contractName: string,
- functionName: string,
- functionArgs: any[],
- options: {
- postConditions?: any[];
- network?: 'mainnet' | 'testnet';
- fee?: string;
- } = {}
- ) {
- const { postConditions = [], network = 'testnet', fee } = options;
-
- for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
- try {
- const response = await request('stx_callContract', {
- contract: `${contractAddress}.${contractName}`,
- functionName,
- functionArgs,
- postConditions,
- network,
- ...(fee && { fee }),
- });
-
- return {
- success: true,
- txid: response.txid,
- attempt,
- };
- } catch (error) {
- if (attempt === this.maxRetries) {
- throw new Error(`Contract call failed after ${this.maxRetries} attempts: ${error.message}`);
- }
-
- await this.delay(this.retryDelay * attempt);
- }
- }
- }
-
- private delay(ms: number): Promise {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
-}
-```
-
-## Step 2: Implement post conditions for security
-
-Post conditions protect users from unexpected contract behavior. They specify what should happen to balances and tokens during transaction execution.
-
-### STX transfer post conditions
-
-```typescript
-import {
- createSTXPostCondition,
- FungibleConditionCode,
- PostConditionMode
-} from '@stacks/transactions';
-
-// Protect STX transfers with post conditions
-async function transferSTXWithProtection() {
- const userAddress = getUserAddress(); // From your wallet integration
- const recipientAddress = 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN';
- const amountMicroSTX = '1000000'; // 1 STX
-
- // Create post condition: sender sends exactly 1 STX
- const postCondition = createSTXPostCondition(
- userAddress,
- FungibleConditionCode.Equal,
- amountMicroSTX
- );
-
- try {
- const response = await request('stx_transferStx', {
- amount: amountMicroSTX,
- recipient: recipientAddress,
- network: 'testnet',
- postConditions: [postCondition],
- });
-
- console.log('Protected STX transfer successful:', response.txid);
- return response;
- } catch (error) {
- console.error('STX transfer failed:', error);
- throw error;
- }
-}
-```
-
-### Token contract post conditions
-
-```typescript
-// Protect token contract interactions
-async function callContractWithTokenProtection() {
- const userAddress = getUserAddress();
- const contractAddress = 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM';
- const contractName = 'my-token';
-
- // Protect against unexpected token transfers
- const tokenPostCondition = createFungiblePostCondition(
- userAddress,
- FungibleConditionCode.LessEqual,
- '100000000', // Max 100 tokens (assuming 6 decimals)
- createAssetInfo(contractAddress, contractName, 'my-token')
- );
-
- const contractInteraction = new ContractInteraction();
-
- try {
- const result = await contractInteraction.callContractFunction(
- contractAddress,
- contractName,
- 'transfer-tokens',
- [
- Cl.uint(50000000), // 50 tokens
- Cl.principal(userAddress),
- Cl.principal('SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN'),
- Cl.none(), // memo
- ],
- {
- postConditions: [tokenPostCondition],
- network: 'testnet',
- }
- );
-
- console.log('Protected token transfer:', result.txid);
- return result;
- } catch (error) {
- console.error('Token transfer with protection failed:', error);
- throw error;
- }
-}
-```
-
-## Step 3: Handle SIP-010 fungible tokens
-
-SIP-010 defines the standard for fungible tokens on Stacks. Here's how to interact with them securely:
-
-```typescript
-// SIP-010 token operations
-export class SIP010TokenHandler {
- constructor(
- private contractAddress: string,
- private contractName: string,
- private tokenName: string,
- private decimals: number = 6
- ) {}
-
- // Get token balance
- async getBalance(address: string): Promise {
- try {
- const response = await fetch(
- `https://api.testnet.hiro.so/v2/contracts/call-read/${this.contractAddress}/${this.contractName}/get-balance`,
- {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- sender: address,
- arguments: [Cl.principal(address).serialize()],
- }),
- }
- );
-
- const data = await response.json();
- const balanceCV = hexToCV(data.result);
- const balance = cvToValue(balanceCV, true);
-
- return Number(balance.value) / Math.pow(10, this.decimals);
- } catch (error) {
- console.error('Failed to get token balance:', error);
- return 0;
- }
- }
-
- // Transfer tokens with post conditions
- async transfer(
- recipient: string,
- amount: number,
- memo?: string
- ): Promise {
- const userAddress = getUserAddress();
- const amountMicroTokens = Math.floor(amount * Math.pow(10, this.decimals));
-
- // Create comprehensive post conditions
- const postConditions = [
- // Sender loses tokens
- createFungiblePostCondition(
- userAddress,
- FungibleConditionCode.Equal,
- amountMicroTokens.toString(),
- createAssetInfo(this.contractAddress, this.contractName, this.tokenName)
- ),
- // Recipient gains tokens
- createFungiblePostCondition(
- recipient,
- FungibleConditionCode.Equal,
- amountMicroTokens.toString(),
- createAssetInfo(this.contractAddress, this.contractName, this.tokenName)
- ),
- ];
-
- const contractInteraction = new ContractInteraction();
-
- const result = await contractInteraction.callContractFunction(
- this.contractAddress,
- this.contractName,
- 'transfer',
- [
- Cl.uint(amountMicroTokens),
- Cl.principal(userAddress),
- Cl.principal(recipient),
- memo ? Cl.some(Cl.stringUtf8(memo)) : Cl.none(),
- ],
- {
- postConditions,
- network: 'testnet',
- }
- );
-
- return result.txid;
- }
-
- // Approve spending allowance
- async approve(spender: string, amount: number): Promise {
- const userAddress = getUserAddress();
- const amountMicroTokens = Math.floor(amount * Math.pow(10, this.decimals));
-
- const contractInteraction = new ContractInteraction();
-
- const result = await contractInteraction.callContractFunction(
- this.contractAddress,
- this.contractName,
- 'approve',
- [
- Cl.principal(spender),
- Cl.uint(amountMicroTokens),
- ],
- {
- network: 'testnet',
- }
- );
-
- return result.txid;
- }
-}
-```
-
-Usage example:
-
-```typescript
-// Initialize token handler
-const myToken = new SIP010TokenHandler(
- 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- 'my-fungible-token',
- 'MFT',
- 8 // 8 decimal places
-);
-
-// Check balance and transfer
-async function handleTokenTransfer() {
- const userAddress = getUserAddress();
- const balance = await myToken.getBalance(userAddress);
-
- console.log(`Current balance: ${balance} MFT`);
-
- if (balance >= 10) {
- const txid = await myToken.transfer(
- 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',
- 10,
- 'Payment for services'
- );
-
- console.log(`Transfer submitted: ${txid}`);
- } else {
- console.log('Insufficient balance for transfer');
- }
-}
-```
-
-## Step 4: Work with SIP-009 NFTs
-
-NFTs require different handling patterns. Here's a comprehensive NFT interaction system:
-
-```typescript
-// SIP-009 NFT operations
-export class SIP009NFTHandler {
- constructor(
- private contractAddress: string,
- private contractName: string
- ) {}
-
- // Get NFT owner
- async getOwner(tokenId: number): Promise {
- try {
- const response = await fetch(
- `https://api.testnet.hiro.so/v2/contracts/call-read/${this.contractAddress}/${this.contractName}/get-owner`,
- {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- sender: this.contractAddress,
- arguments: [Cl.uint(tokenId).serialize()],
- }),
- }
- );
-
- const data = await response.json();
- const ownerCV = hexToCV(data.result);
- const owner = cvToValue(ownerCV, true);
-
- return owner.value?.value || null;
- } catch (error) {
- console.error('Failed to get NFT owner:', error);
- return null;
- }
- }
-
- // Transfer NFT with post conditions
- async transfer(tokenId: number, recipient: string): Promise {
- const userAddress = getUserAddress();
-
- // Verify ownership before transfer
- const currentOwner = await this.getOwner(tokenId);
- if (currentOwner !== userAddress) {
- throw new Error(`You don't own NFT ${tokenId}`);
- }
-
- // Create NFT post condition
- const nftPostCondition = createNonFungiblePostCondition(
- userAddress,
- NonFungibleConditionCode.DoesNotOwn,
- createAssetInfo(this.contractAddress, this.contractName, 'nft-token'),
- Cl.uint(tokenId)
- );
-
- const contractInteraction = new ContractInteraction();
-
- const result = await contractInteraction.callContractFunction(
- this.contractAddress,
- this.contractName,
- 'transfer',
- [
- Cl.uint(tokenId),
- Cl.principal(userAddress),
- Cl.principal(recipient),
- ],
- {
- postConditions: [nftPostCondition],
- network: 'testnet',
- }
- );
-
- return result.txid;
- }
-
- // List NFT for sale (marketplace pattern)
- async listForSale(
- tokenId: number,
- priceInSTX: number,
- marketplaceContract: string
- ): Promise {
- const userAddress = getUserAddress();
- const priceInMicroSTX = Math.floor(priceInSTX * 1000000);
-
- // Create post conditions for listing
- const postConditions = [
- // NFT goes to marketplace escrow
- createNonFungiblePostCondition(
- userAddress,
- NonFungibleConditionCode.DoesNotOwn,
- createAssetInfo(this.contractAddress, this.contractName, 'nft-token'),
- Cl.uint(tokenId)
- ),
- ];
-
- const contractInteraction = new ContractInteraction();
-
- const [marketplaceAddress, marketplaceName] = marketplaceContract.split('.');
-
- const result = await contractInteraction.callContractFunction(
- marketplaceAddress,
- marketplaceName,
- 'list-nft',
- [
- Cl.contractPrincipal(this.contractAddress, this.contractName),
- Cl.uint(tokenId),
- Cl.uint(priceInMicroSTX),
- ],
- {
- postConditions,
- network: 'testnet',
- }
- );
-
- return result.txid;
- }
-}
-```
-
-## Step 5: Build complex multi-step workflows
-
-Many dApps require multi-step operations. Here's how to build them:
-
-```typescript
-// Multi-step transaction workflow
-export class MultiStepWorkflow {
- private steps: Array<{
- name: string;
- execute: () => Promise;
- verify?: (txid: string) => Promise;
- }> = [];
-
- addStep(
- name: string,
- execute: () => Promise,
- verify?: (txid: string) => Promise
- ) {
- this.steps.push({ name, execute, verify });
- return this;
- }
-
- async executeWorkflow(): Promise<{
- success: boolean;
- completedSteps: number;
- results: Array<{ step: string; txid: string; error?: string }>;
- }> {
- const results = [];
- let completedSteps = 0;
-
- for (const [index, step] of this.steps.entries()) {
- try {
- console.log(`Executing step ${index + 1}: ${step.name}`);
-
- const txid = await step.execute();
- console.log(`Step ${index + 1} completed: ${txid}`);
-
- // Optional verification
- if (step.verify) {
- const verified = await step.verify(txid);
- if (!verified) {
- throw new Error(`Step ${step.name} verification failed`);
- }
- }
-
- results.push({ step: step.name, txid });
- completedSteps++;
-
- // Wait between steps to avoid nonce issues
- if (index < this.steps.length - 1) {
- await this.delay(2000);
- }
-
- } catch (error) {
- console.error(`Step ${index + 1} failed:`, error);
- results.push({
- step: step.name,
- txid: '',
- error: error.message
- });
-
- return {
- success: false,
- completedSteps,
- results,
- };
- }
- }
-
- return {
- success: true,
- completedSteps,
- results,
- };
- }
-
- private delay(ms: number): Promise {
- return new Promise(resolve => setTimeout(resolve, ms));
- }
-}
-```
-
-Example: NFT marketplace purchase workflow:
-
-```typescript
-// Complex marketplace purchase
-async function purchaseNFTWorkflow(
- nftContract: string,
- tokenId: number,
- priceInSTX: number,
- marketplaceContract: string
-) {
- const workflow = new MultiStepWorkflow();
- const userAddress = getUserAddress();
- const priceInMicroSTX = Math.floor(priceInSTX * 1000000);
-
- // Step 1: Approve STX spending
- workflow.addStep(
- 'Approve STX for marketplace',
- async () => {
- const [marketplaceAddress, marketplaceName] = marketplaceContract.split('.');
-
- return await request('stx_callContract', {
- contract: `${marketplaceAddress}.${marketplaceName}`,
- functionName: 'approve-stx',
- functionArgs: [Cl.uint(priceInMicroSTX)],
- network: 'testnet',
- }).then(r => r.txid);
- }
- );
-
- // Step 2: Purchase NFT
- workflow.addStep(
- 'Purchase NFT',
- async () => {
- const [nftAddress, nftName] = nftContract.split('.');
- const [marketplaceAddress, marketplaceName] = marketplaceContract.split('.');
-
- // Complex post conditions for marketplace purchase
- const postConditions = [
- // User pays STX
- createSTXPostCondition(
- userAddress,
- FungibleConditionCode.Equal,
- priceInMicroSTX.toString()
- ),
- // User receives NFT
- createNonFungiblePostCondition(
- userAddress,
- NonFungibleConditionCode.Owns,
- createAssetInfo(nftAddress, nftName, 'nft-token'),
- Cl.uint(tokenId)
- ),
- ];
-
- return await request('stx_callContract', {
- contract: marketplaceContract,
- functionName: 'purchase-nft',
- functionArgs: [
- Cl.contractPrincipal(nftAddress, nftName),
- Cl.uint(tokenId),
- ],
- postConditions,
- network: 'testnet',
- }).then(r => r.txid);
- }
- );
-
- const result = await workflow.executeWorkflow();
-
- if (result.success) {
- console.log('NFT purchase completed successfully!');
- console.log('Transaction IDs:', result.results.map(r => r.txid));
- } else {
- console.error('NFT purchase failed:', result.results);
- }
-
- return result;
-}
-```
-
-## Step 6: Handle wallet compatibility
-
-Different wallets have varying support for advanced features. Here's how to handle compatibility:
-
-```typescript
-// Wallet compatibility handler
-export class WalletCompatibilityHandler {
- private walletCapabilities = {
- 'LeatherProvider': {
- stx_callContract: true,
- stx_deployContract: true,
- stx_transferSip10Ft: true,
- stx_transferSip9Nft: true,
- postConditions: 'hex-encoded', // Requires hex-encoded post conditions
- },
- 'xverse': {
- stx_callContract: true,
- stx_deployContract: true,
- stx_transferSip10Ft: false,
- stx_transferSip9Nft: false,
- postConditions: 'none', // No post-condition support
- },
- };
-
- async detectWallet(): Promise {
- // Detect active wallet provider
- if (window.LeatherProvider) return 'LeatherProvider';
- if (window.BitcoinProvider) return 'xverse';
- return null;
- }
-
- async callContractWithCompatibility(
- contract: string,
- functionName: string,
- functionArgs: any[],
- postConditions: any[] = []
- ) {
- const walletType = await this.detectWallet();
-
- if (!walletType) {
- throw new Error('No compatible wallet detected');
- }
-
- const capabilities = this.walletCapabilities[walletType];
-
- if (!capabilities.stx_callContract) {
- throw new Error(`${walletType} doesn't support contract calls`);
- }
-
- // Adjust post conditions based on wallet
- let adjustedPostConditions = postConditions;
-
- if (capabilities.postConditions === 'none') {
- console.warn('Wallet doesn\'t support post conditions - transaction is less secure');
- adjustedPostConditions = [];
- } else if (capabilities.postConditions === 'hex-encoded') {
- // Convert post conditions to hex if needed
- adjustedPostConditions = postConditions.map(pc => ({
- ...pc,
- // Wallet-specific post condition formatting
- }));
- }
-
- try {
- const response = await request('stx_callContract', {
- contract,
- functionName,
- functionArgs,
- postConditions: adjustedPostConditions,
- network: 'testnet',
- });
-
- return response;
- } catch (error) {
- // Retry without post conditions if they caused the failure
- if (postConditions.length > 0 && error.message.includes('post')) {
- console.warn('Retrying without post conditions due to wallet incompatibility');
-
- return await request('stx_callContract', {
- contract,
- functionName,
- functionArgs,
- network: 'testnet',
- });
- }
-
- throw error;
- }
- }
-}
-```
-
-## Step 7: Message signing for authentication
-
-Message signing enables user authentication and data verification without blockchain transactions. It's essential for login systems, data integrity verification, and off-chain authentication.
-
-### Simple message signing
-
-```typescript
-// Simple message signing for authentication
-export class MessageSigner {
- async signAuthenticationMessage(challenge: string): Promise<{
- signature: string;
- publicKey: string;
- message: string;
- }> {
- const message = `Authentication Challenge: ${challenge}\nTimestamp: ${Date.now()}`;
-
- try {
- const response = await request('stx_signMessage', {
- message,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- message,
- };
- } catch (error) {
- console.error('Message signing failed:', error);
- throw error;
- }
- }
-
- // Sign arbitrary data for verification
- async signDataPayload(data: any): Promise<{
- signature: string;
- publicKey: string;
- payload: string;
- }> {
- const payload = JSON.stringify(data, null, 2);
- const message = `Data Verification:\n${payload}`;
-
- const response = await request('stx_signMessage', {
- message,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- payload,
- };
- }
-}
-```
-
-### Structured message signing (SIP-018)
-
-Structured messages provide type safety and domain separation for complex signing scenarios:
-
-```typescript
-// SIP-018 structured message signing
-export class StructuredMessageSigner {
- constructor(
- private appDomain: string = 'myapp.com',
- private appVersion: string = '1.0.0'
- ) {}
-
- // Sign voting or governance decisions
- async signVotingMessage(
- proposalId: string,
- choice: 'yes' | 'no' | 'abstain',
- userAddress: string
- ): Promise<{ signature: string; publicKey: string }> {
- const clarityMessage = Cl.tuple({
- proposal: Cl.stringAscii(proposalId),
- choice: Cl.stringAscii(choice),
- voter: Cl.principal(userAddress),
- timestamp: Cl.uint(Math.floor(Date.now() / 1000)),
- });
-
- const clarityDomain = Cl.tuple({
- name: Cl.stringAscii(this.appDomain),
- version: Cl.stringAscii(this.appVersion),
- 'chain-id': Cl.uint(1), // 1 for mainnet, 2147483648 for testnet
- });
-
- const response = await request('stx_signStructuredMessage', {
- message: clarityMessage,
- domain: clarityDomain,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- }
-
- // Sign marketplace orders
- async signMarketplaceOrder(order: {
- nftContract: string;
- tokenId: number;
- price: number;
- seller: string;
- expiry: number;
- }): Promise<{ signature: string; publicKey: string }> {
- const clarityMessage = Cl.tuple({
- 'nft-contract': Cl.stringAscii(order.nftContract),
- 'token-id': Cl.uint(order.tokenId),
- 'price': Cl.uint(order.price * 1000000), // Convert to microSTX
- 'seller': Cl.principal(order.seller),
- 'expiry': Cl.uint(order.expiry),
- });
-
- const clarityDomain = Cl.tuple({
- name: Cl.stringAscii('NFT Marketplace'),
- version: Cl.stringAscii('2.0.0'),
- 'chain-id': Cl.uint(1),
- });
-
- const response = await request('stx_signStructuredMessage', {
- message: clarityMessage,
- domain: clarityDomain,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- }
-
- // Sign complex DeFi operations
- async signDeFiAction(action: {
- type: 'swap' | 'stake' | 'unstake';
- amount: number;
- tokenA?: string;
- tokenB?: string;
- slippage?: number;
- }): Promise<{ signature: string; publicKey: string }> {
- const messageData: any = {
- 'action-type': Cl.stringAscii(action.type),
- 'amount': Cl.uint(action.amount),
- 'timestamp': Cl.uint(Math.floor(Date.now() / 1000)),
- };
-
- if (action.tokenA) {
- messageData['token-a'] = Cl.stringAscii(action.tokenA);
- }
- if (action.tokenB) {
- messageData['token-b'] = Cl.stringAscii(action.tokenB);
- }
- if (action.slippage) {
- messageData['slippage'] = Cl.uint(Math.floor(action.slippage * 100)); // Basis points
- }
-
- const clarityMessage = Cl.tuple(messageData);
-
- const clarityDomain = Cl.tuple({
- name: Cl.stringAscii('DeFi Protocol'),
- version: Cl.stringAscii('1.2.0'),
- 'chain-id': Cl.uint(1),
- });
-
- const response = await request('stx_signStructuredMessage', {
- message: clarityMessage,
- domain: clarityDomain,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- }
-}
-```
-
-### Message signing with wallet compatibility
-
-Handle wallet-specific requirements for message signing:
-
-```typescript
-// Message signing with wallet compatibility
-export class CompatibleMessageSigner {
- async signMessageWithCompatibility(
- message: string,
- structured: boolean = false,
- domain?: any
- ): Promise<{ signature: string; publicKey: string }> {
- const walletType = await this.detectWallet();
-
- if (structured && domain) {
- return await this.signStructuredWithCompatibility(message, domain, walletType);
- } else {
- return await this.signSimpleWithCompatibility(message, walletType);
- }
- }
-
- private async signSimpleWithCompatibility(
- message: string,
- walletType: string
- ): Promise<{ signature: string; publicKey: string }> {
- try {
- if (walletType === 'xverse') {
- // Xverse requires publicKey parameter
- const response = await request('stx_signMessage', {
- message,
- publicKey: true, // Non-standard parameter for Xverse
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- } else {
- // Leather and other wallets
- const response = await request('stx_signMessage', {
- message,
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- }
- } catch (error) {
- console.error('Message signing compatibility error:', error);
- throw new Error(`Message signing failed for ${walletType}: ${error.message}`);
- }
- }
-
- private async signStructuredWithCompatibility(
- message: any,
- domain: any,
- walletType: string
- ): Promise<{ signature: string; publicKey: string }> {
- try {
- // Both Leather and Xverse require hex-encoded Clarity values
- const response = await request('stx_signStructuredMessage', {
- message, // Should be properly constructed Clarity tuple
- domain, // Should be properly constructed Clarity tuple
- });
-
- return {
- signature: response.signature,
- publicKey: response.publicKey,
- };
- } catch (error) {
- console.error('Structured message signing compatibility error:', error);
- throw new Error(`Structured signing failed for ${walletType}: ${error.message}`);
- }
- }
-
- private async detectWallet(): Promise {
- if (window.LeatherProvider) return 'leather';
- if (window.BitcoinProvider) return 'xverse';
- return 'unknown';
- }
-}
-```
-
-### Authentication workflow with message signing
-
-Build complete authentication systems using message signing:
-
-```typescript
-// Complete authentication workflow
-export class AuthenticationSystem {
- private messageSigner = new MessageSigner();
- private compatibleSigner = new CompatibleMessageSigner();
-
- // Generate authentication challenge
- generateChallenge(): string {
- const timestamp = Date.now();
- const random = Math.random().toString(36).substring(2, 15);
- return `${timestamp}-${random}`;
- }
-
- // Authenticate user with message signing
- async authenticateUser(challenge: string): Promise<{
- authenticated: boolean;
- userAddress: string;
- signature: string;
- challenge: string;
- }> {
- try {
- const userAddress = getUserAddress();
- if (!userAddress) {
- throw new Error('No wallet connected');
- }
-
- const authMessage = `Login to MyApp\nChallenge: ${challenge}\nAddress: ${userAddress}`;
-
- const { signature, publicKey } = await this.compatibleSigner.signMessageWithCompatibility(
- authMessage
- );
-
- // Verify signature matches connected wallet
- const derivedAddress = this.deriveAddressFromPublicKey(publicKey);
- const authenticated = derivedAddress === userAddress;
-
- return {
- authenticated,
- userAddress,
- signature,
- challenge,
- };
- } catch (error) {
- console.error('Authentication failed:', error);
- return {
- authenticated: false,
- userAddress: '',
- signature: '',
- challenge,
- };
- }
- }
-
- // Verify signed message on the backend
- async verifySignature(
- message: string,
- signature: string,
- publicKey: string,
- expectedAddress: string
- ): Promise {
- try {
- // This would typically be done on your backend
- const derivedAddress = this.deriveAddressFromPublicKey(publicKey);
-
- if (derivedAddress !== expectedAddress) {
- return false;
- }
-
- // Additional signature verification logic would go here
- // Using a library like @stacks/encryption or similar
-
- return true; // Simplified for example
- } catch (error) {
- console.error('Signature verification failed:', error);
- return false;
- }
- }
-
- private deriveAddressFromPublicKey(publicKey: string): string {
- // Simplified - use proper address derivation in production
- // This would use @stacks/transactions utilities
- return 'SP' + publicKey.slice(-38); // Placeholder
- }
-}
-```
-
-## Verify your implementation
-
-Test your smart contract interactions and message signing across different scenarios:
-
-### 1. Test token operations
-
-```typescript
-// Test SIP-010 token workflow
-async function testTokenOperations() {
- const token = new SIP010TokenHandler(
- 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- 'test-token',
- 'TEST',
- 6
- );
-
- const userAddress = getUserAddress();
-
- // Check balance
- const balance = await token.getBalance(userAddress);
- console.log(`Token balance: ${balance} TEST`);
-
- // Transfer tokens
- if (balance > 0) {
- const txid = await token.transfer(
- 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',
- 1,
- 'Test transfer'
- );
- console.log(`Transfer transaction: ${txid}`);
- }
-}
-```
-
-### 2. Test NFT operations
-
-```typescript
-// Test SIP-009 NFT workflow
-async function testNFTOperations() {
- const nft = new SIP009NFTHandler(
- 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- 'test-nft'
- );
-
- // Check NFT ownership
- const owner = await nft.getOwner(1);
- console.log(`NFT #1 owner: ${owner}`);
-
- // Transfer if owned
- if (owner === getUserAddress()) {
- const txid = await nft.transfer(1, 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN');
- console.log(`NFT transfer transaction: ${txid}`);
- }
-}
-```
-
-### 3. Test wallet compatibility
-
-```typescript
-// Test wallet compatibility
-async function testWalletCompatibility() {
- const compatibility = new WalletCompatibilityHandler();
- const walletType = await compatibility.detectWallet();
-
- console.log(`Detected wallet: ${walletType}`);
-
- try {
- const result = await compatibility.callContractWithCompatibility(
- 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.test-contract',
- 'test-function',
- [Cl.uint(42)],
- [] // Post conditions
- );
-
- console.log('Compatible contract call successful:', result.txid);
- } catch (error) {
- console.error('Compatibility test failed:', error);
- }
-}
-```
-
-### 4. Test message signing
-
-```typescript
-// Test message signing functionality
-async function testMessageSigning() {
- const messageSigner = new MessageSigner();
- const structuredSigner = new StructuredMessageSigner('testapp.com', '1.0.0');
- const authSystem = new AuthenticationSystem();
-
- // Test simple message signing
- try {
- const challenge = authSystem.generateChallenge();
- const authResult = await messageSigner.signAuthenticationMessage(challenge);
-
- console.log('Simple message signing successful:', authResult.signature);
- } catch (error) {
- console.error('Simple message signing failed:', error);
- }
-
- // Test structured message signing
- try {
- const userAddress = getUserAddress();
- const votingResult = await structuredSigner.signVotingMessage(
- 'proposal-001',
- 'yes',
- userAddress
- );
-
- console.log('Structured message signing successful:', votingResult.signature);
- } catch (error) {
- console.error('Structured message signing failed:', error);
- }
-
- // Test authentication workflow
- try {
- const challenge = authSystem.generateChallenge();
- const authResult = await authSystem.authenticateUser(challenge);
-
- if (authResult.authenticated) {
- console.log('Authentication successful for:', authResult.userAddress);
- } else {
- console.log('Authentication failed');
- }
- } catch (error) {
- console.error('Authentication test failed:', error);
- }
-}
-```
-
-### 5. Test cross-wallet message signing
-
-```typescript
-// Test message signing across different wallets
-async function testCrossWalletSigning() {
- const compatibleSigner = new CompatibleMessageSigner();
- const walletType = await compatibleSigner.detectWallet();
-
- console.log(`Testing message signing with ${walletType} wallet`);
-
- // Test simple message with wallet compatibility
- try {
- const result = await compatibleSigner.signMessageWithCompatibility(
- 'Cross-wallet compatibility test message'
- );
-
- console.log(`${walletType} simple signing successful:`, result.signature);
- } catch (error) {
- console.error(`${walletType} simple signing failed:`, error);
- }
-
- // Test structured message with wallet compatibility
- try {
- const clarityMessage = Cl.tuple({
- action: Cl.stringAscii('test'),
- timestamp: Cl.uint(Math.floor(Date.now() / 1000)),
- });
-
- const clarityDomain = Cl.tuple({
- name: Cl.stringAscii('Test App'),
- version: Cl.stringAscii('1.0.0'),
- 'chain-id': Cl.uint(1),
- });
-
- const result = await request('stx_signStructuredMessage', {
- message: clarityMessage,
- domain: clarityDomain,
- });
-
- console.log(`${walletType} structured signing successful:`, result.signature);
- } catch (error) {
- console.error(`${walletType} structured signing failed:`, error);
- }
-}
-```
-
-## Deploy and try it out
-
-Create a complete smart contract interaction interface:
-
-```html
-
-
-
- Advanced Contract Interactions
-
-
-
-
-
Token Operations
-
Check Balance
-
Transfer Tokens
-
-
-
-
-
NFT Operations
-
Check NFT Ownership
-
Transfer NFT
-
List for Sale
-
-
-
-
-
Complex Workflows
-
Purchase NFT
-
-
-
-
-
Message Signing
-
Sign Simple Message
-
Sign Voting Message
-
Authenticate User
-
Sign Order
-
-
-
-
-
-
-```
-
-## Troubleshooting
-
-**Post conditions failing**
-- Verify exact amounts and addresses in post conditions
-- Check wallet compatibility - some wallets don't support post conditions
-- Use `PostConditionMode.Allow` for testing, `Deny` for production
-
-**Token operations not working**
-- Confirm contract implements SIP-010 or SIP-009 standards correctly
-- Check token contract address and name spelling
-- Verify user has sufficient balance for transfers
-
-**Multi-step workflows failing**
-- Add longer delays between steps for slow networks
-- Implement transaction status checking before next step
-- Handle nonce conflicts with proper sequencing
-
-**Message signing failures**
-- Leather doesn't support non-standard `publicKey` parameter - omit it
-- Xverse requires non-standard `publicKey` parameter for simple messages
-- Both wallets require hex-encoded Clarity values for structured messages
-- Verify message format matches wallet expectations
-
-**Structured message signing errors**
-- Ensure Clarity tuples are properly constructed with `Cl` helpers
-- Domain separation requires consistent naming across app versions
-- Chain ID must match network: 1 for mainnet, 2147483648 for testnet
-- Complex nested structures may not be supported by all wallets
-
-**Authentication workflow issues**
-- Generate unique challenges to prevent replay attacks
-- Verify signature on backend before trusting authentication
-- Handle wallet connection changes during auth process
-- Implement proper session management and timeout handling
-
-**Wallet compatibility issues**
-- Reference the [wallet support table](/docs/building-frontend-applications/wallet-integration#wallet-support) for feature availability
-- Implement fallback methods for unsupported features
-- Test with multiple wallet types during development
-- Handle wallet-specific parameter requirements for message signing
\ No newline at end of file
diff --git a/content/_hidden/(building-frontend-applications)/meta.json b/content/_hidden/(building-frontend-applications)/meta.json
deleted file mode 100644
index 1d847c48c..000000000
--- a/content/_hidden/(building-frontend-applications)/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "building-frontend-applications",
- "pages": ["wallet-integration", "interacting-with-smart-contracts"]
-}
diff --git a/content/_hidden/(building-frontend-applications)/wallet-integration.mdx b/content/_hidden/(building-frontend-applications)/wallet-integration.mdx
deleted file mode 100644
index d0eda0d79..000000000
--- a/content/_hidden/(building-frontend-applications)/wallet-integration.mdx
+++ /dev/null
@@ -1,383 +0,0 @@
----
-title: Wallet integration
-description: Connect your web app to Stacks wallets and enable users to authenticate, sign transactions, and interact with smart contracts
----
-
-Wallet integration transforms your web app from a static interface into a fully interactive blockchain application. Users can authenticate with their Stacks wallets, sign transactions, and interact with smart contracts directly from your app.
-
-Stacks Connect makes this integration straightforward with a single library that works with all major Stacks wallets including Leather, Xverse, and Asigna.
-
-## What you'll learn
-
-You'll learn how to:
-- Connect and disconnect Stacks wallets
-- Authenticate users and manage connection state
-- Read user account information and balances
-- Enable contract function calls from your frontend
-- Deploy contracts through wallet interactions
-- Sign messages for authentication and verification
-
-## Prerequisites
-
-Before starting, make sure you have:
-- A web application (React, vanilla JS, or any framework)
-- Basic knowledge of JavaScript and async/await
-- [Node.js and npm](https://nodejs.org/) installed
-- A Stacks wallet extension for testing (we recommend [Leather](https://leather.io/))
-
-## Step 1: Install Stacks Connect
-
-Install the latest version of Stacks Connect in your project:
-
-```bash
-npm install @stacks/connect@latest
-```
-
-> **Note:** This guide uses Stacks Connect v8.x.x which introduces the new `request` method pattern. If you're migrating from v7.x.x, the old `showConnect`, `openContractCall` methods are deprecated in favor of the unified `request` approach.
-
-Stacks Connect works with any JavaScript framework or vanilla JS applications.
-
-## Step 2: Set up wallet connection
-
-Create connection functions using the new `connect`, `disconnect`, and `isConnected` methods:
-
-```typescript
-import { connect, disconnect, isConnected, getLocalStorage } from '@stacks/connect';
-
-// Connect wallet function
-async function connectWallet() {
- try {
- const response = await connect({
- forceWalletSelect: true, // Always show wallet selection modal
- });
-
- console.log('Connected successfully:', response);
- updateUserInterface();
- } catch (error) {
- console.error('Connection failed:', error);
- }
-}
-
-// Check if user is connected
-function isUserConnected() {
- return isConnected();
-}
-
-// Disconnect wallet function
-function disconnectWallet() {
- disconnect();
- updateUserInterface();
-}
-
-// Get stored user data from local storage
-function getUserData() {
- if (!isConnected()) return null;
-
- const data = getLocalStorage();
- return data?.addresses?.stx?.[0]?.address || null;
-}
-```
-
-Add connect/disconnect buttons to your UI:
-
-```html
-
-
- Connect Wallet
-
-
- Disconnect
-
-
-
-```
-
-## Step 3: Read user account data
-
-Once connected, access user information and display it:
-
-```typescript
-// Get STX balance
-async function getStxBalance(address, network = 'mainnet') {
- const baseUrl = network === 'mainnet'
- ? 'https://api.hiro.so'
- : 'https://api.testnet.hiro.so';
-
- try {
- const response = await fetch(`${baseUrl}/v2/accounts/${address}?proof=0`);
- const data = await response.json();
-
- return {
- balance: parseInt(data.balance) / 1000000, // Convert to STX
- locked: parseInt(data.locked) / 1000000,
- nonce: data.nonce,
- };
- } catch (error) {
- console.error('Failed to fetch balance:', error);
- return { balance: 0, locked: 0, nonce: 0 };
- }
-}
-
-// Update UI with user data
-async function updateUserInterface() {
- const userAddress = getUserData();
- const userInfoDiv = document.getElementById('user-info');
- const connectBtn = document.getElementById('connect-wallet');
- const disconnectBtn = document.getElementById('disconnect-wallet');
-
- if (userAddress) {
- const balance = await getStxBalance(userAddress);
-
- userInfoDiv.innerHTML = `
- Address: ${userAddress}
- Balance: ${balance.balance} STX
- `;
- userInfoDiv.style.display = 'block';
- connectBtn.style.display = 'none';
- disconnectBtn.style.display = 'block';
- enableWalletFeatures();
- } else {
- userInfoDiv.style.display = 'none';
- connectBtn.style.display = 'block';
- disconnectBtn.style.display = 'none';
- disableWalletFeatures();
- }
-}
-```
-
-## Step 4: Make contract calls
-
-Enable users to interact with smart contracts using the new `request` method:
-
-```typescript
-import { request } from '@stacks/connect';
-import { Cl } from '@stacks/transactions';
-
-// Call a contract function
-async function callContract() {
- try {
- const response = await request('stx_callContract', {
- contract: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.hello-world',
- functionName: 'set-value',
- functionArgs: [
- Cl.uint(42),
- Cl.stringUtf8('Hello from frontend!')
- ],
- network: 'testnet', // or 'mainnet'
- });
-
- console.log('Transaction ID:', response.txid);
- alert(`Transaction submitted! ID: ${response.txid}`);
- } catch (error) {
- console.error('Contract call failed:', error);
- alert('Transaction failed: ' + error.message);
- }
-}
-```
-
-Add a button to trigger contract calls:
-
-```html
-
- Call Contract
-
-```
-
-## Step 5: Deploy contracts
-
-Let users deploy contracts directly from your interface:
-
-```typescript
-// Deploy a contract
-async function deployContract() {
- const contractCode = `
- ;; A simple counter contract
- (define-data-var counter uint u0)
-
- (define-read-only (get-counter)
- (var-get counter))
-
- (define-public (increment)
- (begin
- (var-set counter (+ (var-get counter) u1))
- (ok (var-get counter))))
- `;
-
- try {
- const response = await request('stx_deployContract', {
- name: 'my-counter-contract',
- clarityCode: contractCode,
- clarityVersion: '2',
- network: 'testnet',
- });
-
- console.log('Contract deployed! Transaction ID:', response.txid);
- alert(`Contract deployed! Transaction ID: ${response.txid}`);
- } catch (error) {
- console.error('Contract deployment failed:', error);
- alert('Deployment failed: ' + error.message);
- }
-}
-```
-
-Add deployment button:
-
-```html
-
- Deploy Contract
-
-```
-
-## Step 6: Sign messages
-
-Implement message signing for authentication and verification:
-
-```typescript
-// Sign a simple message
-async function signMessage() {
- const message = 'Please sign this message to verify your identity';
-
- try {
- const response = await request('stx_signMessage', {
- message,
- });
-
- console.log('Message signed:', response.signature);
- console.log('Public key:', response.publicKey);
-
- // Store signature for verification
- localStorage.setItem('userSignature', JSON.stringify(response));
- alert('Message signed successfully!');
- } catch (error) {
- console.error('Message signing failed:', error);
- alert('Signing failed: ' + error.message);
- }
-}
-
-// Sign a structured message
-async function signStructuredMessage() {
- try {
- // Create structured message using Clarity values
- const clarityMessage = Cl.tuple({
- proposal: Cl.stringAscii('Increase block reward'),
- choice: Cl.stringAscii('Yes'),
- voter: Cl.stringAscii(getUserData() || ''),
- });
-
- const clarityDomain = Cl.tuple({
- name: Cl.stringAscii('My dApp'),
- version: Cl.stringAscii('1.0.0'),
- 'chain-id': Cl.uint(1),
- });
-
- const response = await request('stx_signStructuredMessage', {
- message: clarityMessage,
- domain: clarityDomain,
- });
-
- console.log('Structured message signed:', response);
- alert('Structured message signed successfully!');
- } catch (error) {
- console.error('Structured message signing failed:', error);
- alert('Structured signing failed: ' + error.message);
- }
-}
-```
-
-Add signing buttons:
-
-```html
-
- Sign Message
-
-
- Sign Structured Message
-
-```
-
-## Step 7: Persist user session
-
-Store wallet connection state across browser sessions:
-
-```typescript
-// Check connection status on page load
-function initializeApp() {
- updateUserInterface();
-}
-
-// Enable wallet-dependent features
-function enableWalletFeatures() {
- document.getElementById('contract-call-btn').disabled = false;
- document.getElementById('deploy-contract-btn').disabled = false;
- document.getElementById('sign-message-btn').disabled = false;
- document.getElementById('sign-structured-btn').disabled = false;
-}
-
-// Disable wallet features when disconnected
-function disableWalletFeatures() {
- document.getElementById('contract-call-btn').disabled = true;
- document.getElementById('deploy-contract-btn').disabled = true;
- document.getElementById('sign-message-btn').disabled = true;
- document.getElementById('sign-structured-btn').disabled = true;
-}
-
-// Store additional user preferences
-function storeUserPreferences(preferences) {
- localStorage.setItem('userPreferences', JSON.stringify(preferences));
-}
-
-function getUserPreferences() {
- const stored = localStorage.getItem('userPreferences');
- return stored ? JSON.parse(stored) : {};
-}
-
-// Initialize on page load
-document.addEventListener('DOMContentLoaded', initializeApp);
-```
-
-## Verify it's working
-
-Test your wallet integration:
-
-1. **Open your app** in a browser with a Stacks wallet installed
-2. **Click "Connect Wallet"** and select your preferred wallet
-3. **Verify user info displays** including address and balance
-4. **Test contract calls** - transactions should open in the wallet
-5. **Try message signing** - wallet should prompt for signature
-6. **Refresh the page** - connection should persist
-
-Connected successfully? Your wallet integration is working!
-
-## Troubleshooting
-
-**Wallet not detected**
-- Ensure you have a Stacks wallet extension installed
-- Try refreshing the page after installing the wallet
-- Check browser console for any JavaScript errors
-
-**Connection popup doesn't appear**
-- Check if popup blockers are disabled for your site
-- Verify you're using the latest version of `@stacks/connect`
-- Make sure you're serving over HTTPS in production
-
-**Transactions fail**
-- Verify contract addresses and function names are correct
-- Check that the user has sufficient STX for fees
-- Ensure you're using the correct network ('testnet' vs 'mainnet')
-- Check that Clarity values are properly constructed with `Cl` helpers
-
-**User session not persisting**
-- Check localStorage is enabled in the browser
-- Verify `isConnected()` is called after page load
-- Make sure `connect()` completed successfully
-
-**Balance not updating**
-- API calls may be cached - add timestamp parameters
-- Check network configuration matches the user's wallet
-- Verify the Stacks API endpoints are accessible
-
-**Migration from older versions**
-- Replace `showConnect()` with `connect()`
-- Replace `openContractCall()` with `request('stx_callContract', {})`
-- Replace `UserSession` usage with `isConnected()` and `getLocalStorage()`
-- Update error handling from `onFinish/onCancel` to `try/catch`
\ No newline at end of file
diff --git a/content/_hidden/(deployment)/configuring-your-deployment-plans.mdx b/content/_hidden/(deployment)/configuring-your-deployment-plans.mdx
deleted file mode 100644
index f6cceb8f4..000000000
--- a/content/_hidden/(deployment)/configuring-your-deployment-plans.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Working with deployment plans
-description: Working with deployment plans
----
-
-## Working with deployment plans
\ No newline at end of file
diff --git a/content/_hidden/(deployment)/deploying-your-application.mdx b/content/_hidden/(deployment)/deploying-your-application.mdx
deleted file mode 100644
index 5fc485e6b..000000000
--- a/content/_hidden/(deployment)/deploying-your-application.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Deploying your application
-description: Deploying your application
----
-
-## Deploying your application
\ No newline at end of file
diff --git a/content/_hidden/(deployment)/meta.json b/content/_hidden/(deployment)/meta.json
deleted file mode 100644
index 37c99f4b0..000000000
--- a/content/_hidden/(deployment)/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "deployment",
- "pages": ["deploying-your-application", "configuring-your-deployment-plans"]
-}
diff --git a/content/_hidden/(event-streaming)/building-a-simple-indexer.mdx b/content/_hidden/(event-streaming)/building-a-simple-indexer.mdx
deleted file mode 100644
index 50568eba7..000000000
--- a/content/_hidden/(event-streaming)/building-a-simple-indexer.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Building an Indexer
-description: Building an Indexer
----
-
-## Building a simple indexer
\ No newline at end of file
diff --git a/content/_hidden/(event-streaming)/contract-monitoring.mdx b/content/_hidden/(event-streaming)/contract-monitoring.mdx
deleted file mode 100644
index de8868a50..000000000
--- a/content/_hidden/(event-streaming)/contract-monitoring.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Contract monitoring
-description: Contract monitoring
----
-
-## Contract monitoring
\ No newline at end of file
diff --git a/content/_hidden/(event-streaming)/creating-predicates.mdx b/content/_hidden/(event-streaming)/creating-predicates.mdx
deleted file mode 100644
index 6a83084dd..000000000
--- a/content/_hidden/(event-streaming)/creating-predicates.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Creating Predicates
-description: Learn how to create predicates for your Clarinet project.
----
-
-# Creating Predicates
\ No newline at end of file
diff --git a/content/_hidden/(event-streaming)/meta.json b/content/_hidden/(event-streaming)/meta.json
deleted file mode 100644
index f0a3d0f5f..000000000
--- a/content/_hidden/(event-streaming)/meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "title": "event-driven-architecture",
- "pages": [
- "creating-predicates",
- "working-with-events-and-transaction-payloads",
- "building-a-simple-indexer",
- "contract-monitoring"
- ]
-}
diff --git a/content/_hidden/(event-streaming)/working-with-events-and-transaction-payloads.mdx b/content/_hidden/(event-streaming)/working-with-events-and-transaction-payloads.mdx
deleted file mode 100644
index fe002a1db..000000000
--- a/content/_hidden/(event-streaming)/working-with-events-and-transaction-payloads.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Creating custom indexers
-description: Creating custom indexers
----
-
-## Creating custom indexers
\ No newline at end of file
diff --git a/content/_hidden/(local-development)/building-transactions.mdx b/content/_hidden/(local-development)/building-transactions.mdx
deleted file mode 100644
index f0933ab27..000000000
--- a/content/_hidden/(local-development)/building-transactions.mdx
+++ /dev/null
@@ -1,434 +0,0 @@
----
-title: Building Transactions
-description: Create and customize all types of Stacks transactions with precise control over signing, sponsorship, and multi-signature scenarios
----
-
-Building transactions programmatically gives you complete control over how your application interacts with the Stacks blockchain. You can create signed transactions for immediate broadcast, unsigned transactions for multi-signature workflows, sponsored transactions to pay fees for users, and complex multi-signature transactions.
-
-This approach is essential for backends, automated systems, and advanced dApps that need precise transaction control.
-
-## Feature overview
-
-Stacks.js provides transaction builders for every blockchain operation:
-
-**STX transfers**: Send native tokens between accounts with memo support
-**Contract deployment**: Deploy Clarity smart contracts with version control
-**Contract calls**: Execute functions with proper argument validation and post-conditions
-**Sponsored transactions**: Pay transaction fees for other users
-**Multi-signature transactions**: Require multiple signatures for enhanced security
-**Fee and nonce management**: Automatic estimation or explicit control
-
-## Required packages
-
-Install the core transaction building package:
-
-```bash
-npm install @stacks/transactions@latest
-```
-
-The `@stacks/network` package is optional in v7 - you can use string literals for networks.
-
-## Building signed transactions
-
-Signed transactions are ready to broadcast immediately. The private key signs the transaction during creation.
-
-### STX token transfer
-
-Send STX tokens between accounts:
-
-```typescript
-import { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';
-
-const transaction = await makeSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000', // 1 STX in microSTX
- senderKey: 'your-private-key-hex',
- network: 'testnet',
- memo: 'Payment for services',
- // nonce and fee are auto-fetched/estimated if not provided
-});
-
-const result = await broadcastTransaction({
- transaction,
- network: 'testnet'
-});
-
-console.log('Transaction ID:', result.txid);
-```
-
-### Smart contract deployment
-
-Deploy Clarity contracts to the blockchain:
-
-```typescript
-import { makeContractDeploy } from '@stacks/transactions';
-import { readFileSync } from 'fs';
-
-const contractCode = readFileSync('./my-contract.clar', 'utf8');
-
-const transaction = await makeContractDeploy({
- contractName: 'my-awesome-contract',
- codeBody: contractCode,
- senderKey: 'your-private-key-hex',
- network: 'testnet',
- clarityVersion: 3, // Defaults to latest if not specified
-});
-
-const result = await broadcastTransaction({
- transaction,
- network: 'testnet'
-});
-```
-
-### Smart contract function call
-
-Execute contract functions with arguments and post-conditions:
-
-```typescript
-import { makeContractCall, Cl } from '@stacks/transactions';
-
-const transaction = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'hello-world',
- functionName: 'set-value',
- functionArgs: [
- Cl.uint(42),
- Cl.stringUtf8('Hello Stacks!')
- ],
- senderKey: 'your-private-key-hex',
- network: 'testnet',
- validateWithAbi: true, // Validates against contract ABI
- postConditions: [], // Add safety conditions
-});
-```
-
-## Building unsigned transactions
-
-Unsigned transactions require a separate signing step. Use these for multi-signature workflows or when you want to inspect transactions before signing.
-
-### Unsigned STX transfer
-
-```typescript
-import { makeUnsignedSTXTokenTransfer } from '@stacks/transactions';
-import { privateKeyToPublicKey } from '@stacks/transactions';
-
-const publicKey = privateKeyToPublicKey('your-private-key-hex');
-
-const unsignedTx = await makeUnsignedSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000',
- publicKey: publicKey,
- network: 'testnet',
- memo: 'Unsigned transfer',
-});
-
-// Sign separately
-import { TransactionSigner } from '@stacks/transactions';
-
-const signer = new TransactionSigner(unsignedTx);
-signer.signOrigin('your-private-key-hex');
-
-// Now ready to broadcast
-const signedTx = signer.getTxInComplete();
-```
-
-### Unsigned contract call
-
-```typescript
-import { makeUnsignedContractCall } from '@stacks/transactions';
-
-const unsignedTx = await makeUnsignedContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'my-function',
- functionArgs: [Cl.uint(100)],
- publicKey: publicKey,
- network: 'testnet',
-});
-
-// Sign with TransactionSigner as shown above
-```
-
-## Building sponsored transactions
-
-Sponsored transactions let you pay fees for other users. The origin creates and signs the transaction, then the sponsor adds their signature and fee.
-
-### Create sponsored transaction (origin side)
-
-```typescript
-import { makeContractCall, Cl } from '@stacks/transactions';
-
-// Origin creates transaction with sponsored: true
-const sponsoredTx = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'user-action',
- functionArgs: [Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')],
- senderKey: 'origin-private-key',
- network: 'testnet',
- sponsored: true, // This makes it a sponsored transaction
-});
-
-// Serialize for the sponsor
-const serializedTx = sponsoredTx.serialize();
-```
-
-### Complete sponsored transaction (sponsor side)
-
-```typescript
-import { sponsorTransaction, deserializeTransaction } from '@stacks/transactions';
-
-// Sponsor receives the serialized transaction
-const deserializedTx = deserializeTransaction(serializedTx);
-
-// Sponsor adds fee and signature
-const completedTx = await sponsorTransaction({
- transaction: deserializedTx,
- sponsorPrivateKey: 'sponsor-private-key',
- fee: '2000', // Sponsor pays the fee
- network: 'testnet',
-});
-
-// Sponsor broadcasts the completed transaction
-const result = await broadcastTransaction({
- transaction: completedTx,
- network: 'testnet'
-});
-```
-
-## Building multi-signature transactions
-
-Multi-sig transactions require multiple signatures. Create unsigned transactions and collect signatures from multiple parties.
-
-### Create multi-sig transaction
-
-```typescript
-import {
- makeUnsignedSTXTokenTransfer,
- TransactionSigner,
- privateKeyToPublicKey
-} from '@stacks/transactions';
-
-// Collect public keys from all participants
-const privateKeys = [
- 'private-key-1',
- 'private-key-2',
- 'private-key-3'
-];
-
-const publicKeys = privateKeys.map(privateKeyToPublicKey);
-
-// Create unsigned multi-sig transaction
-const multiSigTx = await makeUnsignedSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '5000000',
- numSignatures: 2, // Require 2 of 3 signatures
- publicKeys: publicKeys,
- network: 'testnet',
-});
-```
-
-### Collect signatures
-
-```typescript
-const signer = new TransactionSigner(multiSigTx);
-
-// First participant signs
-signer.signOrigin(privateKeys[0]);
-
-// Second participant signs
-signer.signOrigin(privateKeys[1]);
-
-// Add remaining public key (unsigned participant)
-signer.appendOrigin(publicKeys[2]);
-
-// Get completed transaction
-const signedMultiSigTx = signer.getTxInComplete();
-```
-
-## Configuration options
-
-### Custom network endpoints
-
-Connect to custom Stacks nodes:
-
-```typescript
-const transaction = await makeSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000',
- senderKey: 'your-private-key',
- network: 'testnet',
- client: { baseUrl: 'http://localhost:3999' } // Custom devnet
-});
-```
-
-### Explicit fee and nonce control
-
-Override automatic fee estimation and nonce fetching:
-
-```typescript
-const transaction = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'my-function',
- functionArgs: [],
- senderKey: 'your-private-key',
- network: 'testnet',
- nonce: '42', // Explicit nonce
- fee: '5000', // Explicit fee in microSTX
- anchorMode: 'any' // Transaction timing preference
-});
-```
-
-### Advanced post-conditions
-
-Add safety constraints using the new v7 post-condition format:
-
-```typescript
-const stxPostCondition = {
- type: 'stx-postcondition',
- address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',
- condition: 'gte',
- amount: '1000000'
-};
-
-const ftPostCondition = {
- type: 'ft-postcondition',
- address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',
- condition: 'eq',
- amount: '100',
- asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-token::token'
-};
-
-const transaction = await makeContractCall({
- // ... other options
- postConditions: [stxPostCondition, ftPostCondition]
-});
-```
-
-### Fee estimation
-
-Get fee estimates before building transactions:
-
-```typescript
-import { fetchFeeEstimate } from '@stacks/transactions';
-
-// Estimate for a specific transaction
-const feeEstimate = await fetchFeeEstimate({
- transaction,
- network: 'testnet'
-});
-
-// Use the estimate
-const newTransaction = await makeSTXTokenTransfer({
- // ... other options
- fee: feeEstimate.toString()
-});
-```
-
-## Working with Clarity values
-
-Use the `Cl` helper for building type-safe Clarity arguments:
-
-```typescript
-import { Cl } from '@stacks/transactions';
-
-const functionArgs = [
- Cl.uint(42), // unsigned integer
- Cl.int(-10), // signed integer
- Cl.bool(true), // boolean
- Cl.stringUtf8('Hello World'), // UTF-8 string
- Cl.stringAscii('ASCII only'), // ASCII string
- Cl.buffer(new Uint8Array([1, 2, 3])), // buffer
- Cl.principal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG'), // principal
- Cl.contractPrincipal('ST123...', 'my-contract'), // contract principal
- Cl.list([Cl.uint(1), Cl.uint(2)]), // list
- Cl.tuple({ name: Cl.stringUtf8('Alice') }), // tuple
- Cl.some(Cl.uint(42)), // optional (some)
- Cl.none(), // optional (none)
- Cl.ok(Cl.uint(100)), // response (ok)
- Cl.error(Cl.uint(404)) // response (error)
-];
-```
-
-## Error handling
-
-Handle broadcast errors properly with the consistent v7 response format:
-
-```typescript
-try {
- const result = await broadcastTransaction({
- transaction,
- network: 'testnet'
- });
-
- if (result.error) {
- console.error('Transaction rejected:', result.reason);
- console.error('Details:', result.reason_data);
- } else {
- console.log('Success:', result.txid);
- }
-} catch (error) {
- console.error('Network or serialization error:', error);
-}
-```
-
-## Best practices
-
-### Transaction serialization
-
-Transactions serialize to hex strings in v7 (not byte arrays):
-
-```typescript
-const transaction = await makeSTXTokenTransfer({ /* options */ });
-const serialized = transaction.serialize(); // hex string
-console.log('Serialized tx:', serialized);
-
-// For bytes (if needed for compatibility)
-const bytes = transaction.serializeBytes(); // Uint8Array
-```
-
-### Nonce management
-
-For multiple transactions, manage nonces carefully:
-
-```typescript
-import { fetchNonce } from '@stacks/transactions';
-
-let currentNonce = await fetchNonce({
- address: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- network: 'testnet'
-});
-
-// Send multiple transactions with incremented nonces
-for (const recipient of recipients) {
- const transaction = await makeSTXTokenTransfer({
- recipient,
- amount: '1000000',
- senderKey: privateKey,
- network: 'testnet',
- nonce: currentNonce.toString()
- });
-
- await broadcastTransaction({ transaction, network: 'testnet' });
- currentNonce++;
-}
-```
-
-### ABI validation
-
-Always validate contract calls against ABIs:
-
-```typescript
-const transaction = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'my-function',
- functionArgs: [Cl.uint(42)],
- senderKey: privateKey,
- network: 'testnet',
- validateWithAbi: true // Fetches ABI and validates arguments
-});
-```
-
-This comprehensive approach to transaction building gives you the flexibility to handle any blockchain interaction scenario while maintaining type safety and proper error handling.
\ No newline at end of file
diff --git a/content/_hidden/(local-development)/configuring-clarity-vscode-extension.mdx b/content/_hidden/(local-development)/configuring-clarity-vscode-extension.mdx
deleted file mode 100644
index afdbe001f..000000000
--- a/content/_hidden/(local-development)/configuring-clarity-vscode-extension.mdx
+++ /dev/null
@@ -1,182 +0,0 @@
----
-title: Configuring Clarity VSCode extension
-description: Essential features and setup for the Clarity VS Code extension to streamline smart contract development
----
-
-The Clarity VS Code extension transforms your editor into a powerful smart contract development environment. You'll get syntax highlighting, auto-completion, debugging, and real-time error checking—all the tools you need to write safe Clarity code.
-
-Think of it as your coding copilot. The extension catches errors before you deploy, suggests functions as you type, and shows documentation without leaving your editor.
-
-> **Need to install the extension?** Check our [Prerequisites guide](/docs/setting-up-your-environment/installing-prerequisites#set-up-vs-code-for-clarity) for installation instructions.
-
-## Core Features
-
-### Smart Auto-Completion
-
-Start typing any Clarity function and get instant suggestions with documentation. The extension adds parentheses and creates placeholders for function arguments.
-
-```clarity
-;; Type "stx-tr" and get:
-(stx-transfer? amount sender recipient)
-;; ^ ^ ^
-;; Placeholders for easy navigation
-```
-
-Use `Tab` to jump between placeholders. Use `Escape` to exit placeholder mode.
-
-### Documentation on Hover
-
-Hover over any Clarity function or keyword to see its documentation. No need to switch tabs or search external docs.
-
-```clarity
-;; Hover over 'map-set' to see:
-;; - Function signature
-;; - Parameter descriptions
-;; - Return type
-;; - Usage examples
-(map-set my-map {key: "value"} "data")
-```
-
-### Go-to Definition
-
-Jump to function, constant, or variable definitions instantly:
-
-- `F12` or `Ctrl+Click` to go to definition
-- `Alt+F12` to peek definition without leaving current file
-- Works across contract files and contract calls
-
-### Real-Time Error Checking
-
-The extension validates your code on every save. You'll see:
-
-- **Red squiggles**: Syntax errors, unknown keywords
-- **Yellow squiggles**: Warnings for potentially unsafe code
-- **Error list**: All issues in the Problems panel (`Ctrl+Shift+M`)
-
-Common errors caught:
-- Undefined variables or functions
-- Type mismatches
-- Missing trait implementations
-- Invalid function signatures
-
-### Local Contract Resolution
-
-Auto-completion works across your entire project. Reference functions from other contracts in your workspace:
-
-```clarity
-;; Auto-complete local contract calls
-(contract-call? .my-token transfer amount sender recipient)
-;; ^
-;; Suggests contracts in your project
-```
-
-### Trait Support
-
-When implementing traits (like SIP-009 NFTs or SIP-010 tokens), the extension verifies:
-
-- All required functions are implemented
-- Function signatures match trait definitions
-- Return types are correct
-
-```clarity
-;; Extension warns if missing required trait functions
-(impl-trait .sip-010-trait.sip-010-trait)
-
-;; ⚠️ Warning: Missing required function 'get-balance'
-```
-
-## Debugging Support
-
-The extension includes a visual debugger for step-by-step code execution.
-
-**Requirements:**
-- VS Code Desktop (doesn't work in web version)
-- [Clarinet installed locally](https://github.com/hirosystems/clarinet#installation)
-
-**How to debug:**
-
-1. Set breakpoints by clicking line numbers
-2. Press `F5` or use Run → Start Debugging
-3. Step through code line-by-line
-4. Inspect variables and stack state
-
-The debugger shows you exactly how Clarity executes your functions, making it easier to understand complex logic and catch bugs.
-
-## Configuration Options
-
-### File Associations
-
-The extension automatically recognizes `.clar` files. For custom extensions:
-
-```json
-// settings.json
-{
- "files.associations": {
- "*.clarity": "clarity"
- }
-}
-```
-
-### Formatting
-
-Enable format-on-save for consistent code style:
-
-```json
-// settings.json
-{
- "editor.formatOnSave": true,
- "[clarity]": {
- "editor.defaultFormatter": "HiroSystems.clarity-lsp"
- }
-}
-```
-
-### Error Checking Frequency
-
-Adjust how often the extension checks for errors:
-
-```json
-// settings.json
-{
- "clarity.checkOnSave": true,
- "clarity.checkOnType": false
-}
-```
-
-## Best Practices
-
-**Organize your workspace**
-- Keep all contract files in your Clarinet project root
-- Use descriptive filenames that match contract names
-- Group related contracts in subdirectories
-
-**Use the extension's power**
-- Hover before assuming—check function documentation
-- Let auto-completion guide you to valid function names
-- Pay attention to error squiggles; they catch real issues
-
-**Debugging workflow**
-- Start with simple functions before debugging complex ones
-- Use breakpoints strategically at decision points
-- Check variable values at each step
-
-**Performance tips**
-- Close unused Clarity files to improve responsiveness
-- For large projects, consider workspace-specific settings
-- Restart the extension (`Ctrl+Shift+P` → "Restart Extension Host") if it becomes slow
-
-## Troubleshooting
-
-**Extension not recognizing files?**
-- Ensure files have `.clar` extension
-- Check if you're in a Clarinet project directory
-- Restart VS Code
-
-**Auto-completion not working?**
-- Verify the language server is running (check status bar)
-- Try reloading the window (`Ctrl+Shift+P` → "Reload Window")
-
-**Debugger won't start?**
-- Confirm Clarinet is installed: `clarinet --version`
-- Make sure you're using VS Code Desktop, not web
-- Check that your project has a valid `Clarinet.toml`
\ No newline at end of file
diff --git a/content/_hidden/(local-development)/creating-a-clarinet-project.mdx b/content/_hidden/(local-development)/creating-a-clarinet-project.mdx
deleted file mode 100644
index 6b49b3c8e..000000000
--- a/content/_hidden/(local-development)/creating-a-clarinet-project.mdx
+++ /dev/null
@@ -1,194 +0,0 @@
----
-title: Creating a Clarinet project
-sidebarTitle: Create a project
-description: Step-by-step guide to create your first smart contract project with Clarinet
----
-
-Ready to build your first smart contract? Clarinet makes it simple to generate a new project, write Clarity code, and test everything locally. You'll have a working counter contract up and running in minutes.
-
-Think of Clarinet as your smart contract workshop. It gives you project structure, testing tools, and a local blockchain—everything you need to build confidently before deploying to mainnet.
-
-## What You'll Learn
-
-- Generate a new Clarinet project
-- Create your first smart contract
-- Write basic Clarity functions
-- Validate your contract code
-- Test contract interactions locally
-
-## What You'll Need
-
-- [Clarinet installed](/docs/setting-up-your-environment/installing-prerequisites)
-- Basic terminal knowledge
-- 10 minutes for the walkthrough
-
-## Step 1: Generate Your Project
-
-Create a new Clarinet project called `counter`. This sets up everything you need for smart contract development.
-
-```terminal
-$ clarinet new counter
-Creating directory counter
-Created file counter/Clarinet.toml
-Created file counter/.gitignore
-Created directory counter/contracts
-Created directory counter/tests
-Created file counter/settings/Devnet.toml
-Created file counter/settings/Mainnet.toml
-Created file counter/settings/Testnet.toml
-Created file counter/package.json
-Created file counter/tsconfig.json
-Created file counter/vitest.config.js
-```
-
-Navigate into your new project:
-
-```terminal
-$ cd counter
-```
-
-You now have a complete Clarinet workspace with:
-- **contracts/**: Where your Clarity files live
-- **tests/**: JavaScript test files
-- **settings/**: Network configurations
-- **Clarinet.toml**: Project configuration
-
-## Step 2: Create Your First Contract
-
-Generate a new smart contract called `counter` inside your project:
-
-```terminal
-$ clarinet contract new counter
-Created contracts/counter.clar
-```
-
-This command:
-- Creates the contract file `contracts/counter.clar`
-- Updates `Clarinet.toml` with contract configuration
-- Sets up the proper folder structure
-
-Your `Clarinet.toml` now includes:
-
-```toml
-[contracts.counter]
-path = 'contracts/counter.clar'
-clarity_version = 2
-epoch = "latest"
-```
-
-## Step 3: Write Your Smart Contract
-
-Open `contracts/counter.clar` and add this code:
-
-```clarity
-;; Define a map to store counters for each user
-(define-map counters principal uint)
-
-;; Public function to increment a user's counter
-(define-public (count-up)
- (ok (map-set counters tx-sender (+ (get-count tx-sender) u1)))
-)
-
-;; Read-only function to get a user's current count
-(define-read-only (get-count (who principal))
- (default-to u0 (map-get? counters who))
-)
-```
-
-**What this contract does:**
-- **counters map**: Stores a number for each user (principal)
-- **count-up function**: Increases the caller's count by 1
-- **get-count function**: Returns anyone's current count
-
-Each user gets their own counter that starts at 0 and increments when they call `count-up`.
-
-## Step 4: Validate Your Contract
-
-Check your contract for syntax errors and issues:
-
-```terminal
-$ clarinet check
-✅ 1 contract checked, no problems found.
-```
-
-See the checkmark? Your contract is valid! If you see errors:
-- Check for typos in function names
-- Make sure parentheses are balanced
-- Verify correct Clarity syntax
-
-Common fixes:
-- Missing or extra parentheses
-- Incorrect function signatures
-- Typos in built-in functions
-
-## Step 5: Test Your Contract Locally
-
-Start the Clarinet console to interact with your contract:
-
-```terminal
-$ clarinet console
-Welcome to Clarinet console.
-Type (help) for available commands.
->>
-```
-
-**Test the count-up function:**
-
-```clarity
->> (contract-call? .counter count-up)
-(ok true)
-```
-
-**Check your count:**
-
-```clarity
->> (contract-call? .counter get-count tx-sender)
-u1
-```
-
-**Increment again:**
-
-```clarity
->> (contract-call? .counter count-up)
-(ok true)
-
->> (contract-call? .counter get-count tx-sender)
-u2
-```
-
-Perfect! Your counter is working. Each call to `count-up` increases your count by 1.
-
-Hit `Ctrl+C` twice to leave the console.
-
-> **Project Structure**: Your Clarinet project includes contracts for your Clarity code, tests for JavaScript unit tests, settings for network configurations, and Clarinet.toml for project configuration. For a complete breakdown of each file and configuration options, see our [Anatomy of a Clarinet Project](/tools/clarinet/anatomy-of-a-clarinet-project) guide.
-
-## Verification
-
-Let's confirm everything is working:
-
-1. **Project created**: `ls` shows all the project files
-2. **Contract valid**: `clarinet check` passes with no errors
-3. **Contract interactive**: Console commands return expected results
-4. **Functions work**: Counter increments correctly
-
-If any step fails, double-check the contract code and try `clarinet check` again.
-
-## Troubleshooting
-
-**"Command not found: clarinet"**
-- Make sure [Clarinet is installed](/docs/setting-up-your-environment/installing-prerequisites)
-- Restart your terminal after installation
-
-**"Contract validation failed"**
-- Check for syntax errors in your `.clar` file
-- Ensure parentheses are balanced
-- Look for typos in function names
-
-**"Console not responding"**
-- Exit with `Ctrl+C` and try `clarinet console` again
-- Make sure you're in your project directory
-
-**"Contract call failed"**
-- Verify the contract name matches your file (`.counter`)
-- Check function names for typos
-- Ensure you're using correct Clarity syntax
diff --git a/content/_hidden/(local-development)/meta.json b/content/_hidden/(local-development)/meta.json
deleted file mode 100644
index 15458daf6..000000000
--- a/content/_hidden/(local-development)/meta.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "title": "local-development",
- "pages": [
- "creating-a-clarinet-project",
- "using-clarity-vscode-extension",
- "working-with-devnet",
- "using-local-accounts",
- "building-transactions"
- ]
-}
diff --git a/content/_hidden/(local-development)/using-local-accounts.mdx b/content/_hidden/(local-development)/using-local-accounts.mdx
deleted file mode 100644
index 28c861f6a..000000000
--- a/content/_hidden/(local-development)/using-local-accounts.mdx
+++ /dev/null
@@ -1,370 +0,0 @@
----
-title: Using Local Accounts
-description: Create, manage, and use local Stacks accounts with private keys for development and testing
----
-
-Local accounts let you work with Stacks blockchain directly using private keys. This approach is perfect for server-side applications, testing environments, and development workflows where you need full control over account operations.
-
-You'll use private keys to sign transactions, call contracts, and manage STX tokens without wallet extensions or user interaction.
-
-## What are local accounts?
-
-A local account is an account whose signing keys are stored and managed directly in your application code. It performs signing of transactions and messages with a private key **before** broadcasting them to the Stacks network.
-
-This is different from wallet-connected accounts (like those using Leather or Xverse), where:
-- **Local accounts**: Private keys live in your code, signing happens locally
-- **Wallet accounts**: Private keys stay in the user's wallet, signing requires user approval
-
-Local accounts are ideal for:
-- **Server-side applications** that need to sign transactions automatically
-- **Development and testing** where you want predictable, fast signing
-- **Automated scripts** for blockchain interactions
-- **Backend services** managing STX transfers or contract calls
-
-There are two ways to create local accounts in Stacks.js:
-- **Private key accounts**: Direct hex private key usage
-- **Seed phrase accounts**: Generate from 24-word mnemonic phrases
-
-## Feature overview
-
-Working with local accounts involves these core operations:
-
-**Account creation**: Generate new accounts with private keys and addresses
-**Account restoration**: Load existing accounts from private keys or seed phrases
-**Balance checking**: Query STX balances and nonces for transaction planning
-**Read-only calls**: Execute contract functions without spending STX
-**Transaction broadcasting**: Send STX transfers and contract calls to the network
-
-## Core packages required
-
-Stacks.js v7 simplifies account management with these packages:
-
-```bash
-npm install @stacks/wallet-sdk @stacks/transactions @stacks/common@latest
-```
-
-The `@stacks/network` package is optional - you can use string literals like `'testnet'` or `'mainnet'` instead.
-
-## Creating new accounts
-
-### Generate a random account
-
-Create a completely new account with a random private key:
-
-```typescript
-import { generateWallet, randomSeedPhrase, getStxAddress } from '@stacks/wallet-sdk';
-
-// Generate new 24-word seed phrase
-const seedPhrase = randomSeedPhrase();
-
-// Create wallet from seed phrase
-const wallet = await generateWallet({
- secretKey: seedPhrase,
- password: 'your-secure-password'
-});
-
-// Access the first account
-const account = wallet.accounts[0];
-const privateKey = account.stxPrivateKey;
-const address = getStxAddress(account, 'testnet');
-
-console.log('Address:', address);
-console.log('Private Key:', privateKey);
-console.log('Seed Phrase:', seedPhrase);
-```
-
-### Generate additional accounts
-
-Add more accounts to an existing wallet:
-
-```typescript
-import { generateNewAccount } from '@stacks/wallet-sdk';
-
-// Add second account to wallet
-const walletWithTwoAccounts = generateNewAccount(wallet);
-const secondAccount = walletWithTwoAccounts.accounts[1];
-const secondAddress = getStxAddress(secondAccount, 'testnet');
-```
-
-## Loading existing accounts
-
-### From private key
-
-Use an existing private key directly:
-
-```typescript
-import { privateKeyToAddress } from '@stacks/transactions';
-
-const privateKey = 'your-64-character-hex-private-key';
-const address = privateKeyToAddress(privateKey, 'testnet');
-```
-
-### From seed phrase
-
-Restore a wallet from a 24-word seed phrase:
-
-```typescript
-import { generateWallet } from '@stacks/wallet-sdk';
-
-const existingSeedPhrase = 'abandon ability able about above absent...';
-const restoredWallet = await generateWallet({
- secretKey: existingSeedPhrase,
- password: 'your-password'
-});
-
-const restoredAccount = restoredWallet.accounts[0];
-```
-
-## Getting account information
-
-### Check STX balance
-
-Query account balance and nonce from the Stacks API:
-
-```typescript
-async function getAccountInfo(address: string, network = 'testnet') {
- const baseUrl = network === 'mainnet'
- ? 'https://api.hiro.so'
- : 'https://api.testnet.hiro.so';
-
- const response = await fetch(`${baseUrl}/v2/accounts/${address}?proof=0`);
- const data = await response.json();
-
- return {
- balance: data.balance,
- locked: data.locked,
- nonce: data.nonce,
- unlockHeight: data.unlock_height
- };
-}
-
-// Usage
-const accountInfo = await getAccountInfo('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM');
-console.log(`Balance: ${accountInfo.balance} microSTX`);
-console.log(`Next nonce: ${accountInfo.nonce}`);
-```
-
-### Get account nonce
-
-Use the built-in function for cleaner nonce fetching:
-
-```typescript
-import { fetchNonce } from '@stacks/transactions';
-
-const nonce = await fetchNonce({
- address: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- network: 'testnet'
-});
-```
-
-## Calling read-only functions
-
-Execute contract functions that don't modify state:
-
-```typescript
-import { fetchCallReadOnlyFunction, Cl } from '@stacks/transactions';
-
-const result = await fetchCallReadOnlyFunction({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'hello-world',
- functionName: 'get-counter',
- functionArgs: [], // No arguments needed
- network: 'testnet',
- senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'
-});
-
-console.log('Contract result:', result);
-```
-
-### With function arguments
-
-Pass Clarity values as function arguments:
-
-```typescript
-const result = await fetchCallReadOnlyFunction({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'get-user-balance',
- functionArgs: [
- Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')
- ],
- network: 'testnet',
- senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'
-});
-```
-
-## Broadcasting transactions
-
-### STX token transfer
-
-Send STX tokens between accounts:
-
-```typescript
-import { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';
-
-const transaction = await makeSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000', // 1 STX in microSTX
- senderKey: privateKey,
- network: 'testnet',
- memo: 'Test transfer',
- // nonce and fee are optional - will be fetched/estimated automatically
-});
-
-const broadcastResponse = await broadcastTransaction({
- transaction,
- network: 'testnet'
-});
-
-console.log('Transaction ID:', broadcastResponse.txid);
-```
-
-### Contract function call
-
-Call a contract function that modifies state:
-
-```typescript
-import { makeContractCall, Cl } from '@stacks/transactions';
-
-const transaction = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'hello-world',
- functionName: 'increment-counter',
- functionArgs: [Cl.uint(5)],
- senderKey: privateKey,
- network: 'testnet',
- validateWithAbi: true // Validates function exists and arguments match
-});
-
-const broadcastResponse = await broadcastTransaction({
- transaction,
- network: 'testnet'
-});
-```
-
-## Configuration options
-
-### Custom network endpoints
-
-Connect to custom Stacks nodes:
-
-```typescript
-const transaction = await makeSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000',
- senderKey: privateKey,
- network: 'testnet',
- client: { baseUrl: 'http://localhost:3999' } // Custom devnet
-});
-```
-
-### Transaction options
-
-Customize transaction behavior:
-
-```typescript
-const transaction = await makeContractCall({
- contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
- contractName: 'my-contract',
- functionName: 'my-function',
- functionArgs: [],
- senderKey: privateKey,
- network: 'testnet',
- nonce: 42, // Explicit nonce
- fee: '1000', // Explicit fee in microSTX
- postConditions: [], // Add safety conditions
- anchorMode: 'any' // Transaction timing preference
-});
-```
-
-### Fee estimation
-
-Get fee estimates before broadcasting:
-
-```typescript
-import { fetchFeeEstimate } from '@stacks/transactions';
-
-const feeEstimate = await fetchFeeEstimate({
- transaction,
- network: 'testnet'
-});
-
-console.log('Estimated fee:', feeEstimate);
-```
-
-## Best practices
-
-### Private key security
-
-Never expose private keys in client-side code or logs:
-
-```typescript
-// ✅ Good - Environment variables
-const privateKey = process.env.PRIVATE_KEY;
-
-// ❌ Bad - Hardcoded keys
-const privateKey = 'edf9aee84d9b7abc145504dde6726c64f369d37ee34ded868fabd876c26570bc';
-```
-
-### Error handling
-
-Always handle network and transaction errors:
-
-```typescript
-try {
- const transaction = await makeSTXTokenTransfer({
- recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
- amount: '1000000',
- senderKey: privateKey,
- network: 'testnet'
- });
-
- const result = await broadcastTransaction({ transaction, network: 'testnet' });
-
- if (result.error) {
- console.error('Transaction failed:', result.reason);
- } else {
- console.log('Success:', result.txid);
- }
-} catch (error) {
- console.error('Network error:', error);
-}
-```
-
-### Nonce management
-
-For multiple transactions, increment nonces manually:
-
-```typescript
-let currentNonce = await fetchNonce({ address, network: 'testnet' });
-
-// Send multiple transactions
-for (const recipient of recipients) {
- const transaction = await makeSTXTokenTransfer({
- recipient,
- amount: '1000000',
- senderKey: privateKey,
- network: 'testnet',
- nonce: currentNonce++
- });
-
- await broadcastTransaction({ transaction, network: 'testnet' });
-}
-```
-
-### Testing on devnet
-
-Use local devnet for faster development:
-
-```typescript
-// Works with clarinet devnet
-const transaction = await makeSTXTokenTransfer({
- recipient: 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5',
- amount: '1000000',
- senderKey: privateKey,
- network: 'devnet',
- client: { baseUrl: 'http://localhost:3999' }
-});
-```
-
-This approach gives you complete control over Stacks accounts for development, testing, and server-side applications. You can sign transactions, interact with contracts, and manage STX tokens without relying on wallet extensions or user interaction.
\ No newline at end of file
diff --git a/content/_hidden/(local-development)/working-with-devnet.mdx b/content/_hidden/(local-development)/working-with-devnet.mdx
deleted file mode 100644
index 82e68ddeb..000000000
--- a/content/_hidden/(local-development)/working-with-devnet.mdx
+++ /dev/null
@@ -1,128 +0,0 @@
----
-title: Working with devnet
-description: Set up and use Clarinet's local development network for testing smart contracts
----
-
-Clarinet's devnet gives you a complete local blockchain environment. You'll run Bitcoin and Stacks nodes, APIs, and explorers right on your machine using Docker containers.
-
-This lets you test contracts, debug transactions, and develop frontends without spending real money or waiting for network confirmations.
-
-## What you'll learn
-
-You'll learn how to:
-- [x] Start and configure a local devnet
-- [x] Deploy contracts to your local network
-- [x] Use devnet accounts for testing
-- [x] Monitor transactions and contract calls
-- [x] Troubleshoot common devnet issues
-
-## Prerequisites
-
-Before starting, make sure you have:
-- [Docker Desktop](https://www.docker.com/products/docker-desktop/) installed and running
-- A Clarinet project (see [Creating a Clarinet Project](/creating-a-clarinet-project))
-- Basic familiarity with terminal commands
-
-## Step 1: Start your devnet
-
-Navigate to your Clarinet project directory and start the devnet:
-
-```bash
-clarinet devnet start
-```
-
-You'll see Docker containers spinning up. This creates a full blockchain stack:
-- Bitcoin node (local bitcoind)
-- Stacks node (local stacks-blockchain)
-- Stacks API (for querying blockchain data)
-- Stacks Explorer (web interface)
-- Bitcoin Explorer
-- PostgreSQL database
-
-The command opens an interactive dashboard by default. You can view logs instead with `--no-dashboard`.
-
-## Step 2: Access your local blockchain
-
-Once devnet starts, you can access these services:
-
-- **Stacks Explorer**: http://localhost:8000 - View blocks, transactions, and contracts
-- **Bitcoin Explorer**: http://localhost:8001 - Monitor Bitcoin transactions
-- **Stacks API**: http://localhost:3999 - Query blockchain data programmatically
-
-Your contracts from `contracts/` are automatically deployed when devnet starts.
-
-## Step 3: Use devnet accounts
-
-Devnet provides pre-funded accounts for testing. You can find account details in:
-- The devnet dashboard (default view)
-- `settings/Devnet.toml` configuration file
-
-Each account has:
-- STX tokens for transaction fees
-- Bitcoin for stacking/mining operations
-- Private keys for signing transactions
-
-## Step 4: Test contract interactions
-
-With devnet running, you can interact with your contracts through:
-
-**Clarinet console** (in a new terminal):
-```bash
-clarinet console
-```
-
-**Frontend applications** pointing to `http://localhost:3999`
-
-**Direct API calls**:
-```bash
-curl http://localhost:3999/v2/info
-```
-
-## Verify it's working
-
-Check that devnet is running properly:
-
-1. **Visit the explorer**: Go to http://localhost:8000 and verify you see recent blocks
-2. **Check API health**: Run `curl http://localhost:3999/v2/info` and confirm you get network info
-3. **View your contracts**: Look for your deployed contracts in the explorer's contract section
-
-See recent transactions and your contract deployments? You're good to go.
-
-## Deploy and try it out
-
-Your contracts are automatically deployed when devnet starts. To test them:
-
-1. **Use the console**: Run `clarinet console` and call contract functions
-2. **Check deployment status**: View deployments in the explorer or dashboard
-3. **Test with a frontend**: Point your dapp to the local API endpoint
-
-## Troubleshooting
-
-**Error: clarinet was unable to create network**
-- Make sure Docker Desktop is running
-- Check that ports 3999, 8000, 8001 aren't in use by other applications
-
-**Containers won't start**
-- Stop any running devnet: `clarinet devnet stop`
-- Clear Docker containers: `docker system prune`
-- Restart devnet
-
-**Contracts not deploying**
-- Check `Clarinet.toml` for syntax errors
-- Verify contract files are in the `contracts/` directory
-- Review deployment logs in the dashboard
-
-## Configuration options
-
-Customize devnet behavior with these flags:
-
-- `--manifest-path`: Use a different Clarinet.toml file
-- `--deployment-plan-path`: Specify custom deployment plan
-- `--no-dashboard`: Show logs instead of interactive dashboard
-- `--use-on-disk-deployment-plan`: Use existing deployment plan without updates
-
-Modify `settings/Devnet.toml` to change:
-- Network ports
-- Docker images
-- Mining configuration
-- Epoch settings
\ No newline at end of file
diff --git a/content/_hidden/(setting-up-your-environment)/installing-prerequisites.mdx b/content/_hidden/(setting-up-your-environment)/installing-prerequisites.mdx
deleted file mode 100644
index 21bf7c46a..000000000
--- a/content/_hidden/(setting-up-your-environment)/installing-prerequisites.mdx
+++ /dev/null
@@ -1,116 +0,0 @@
----
-title: Installing development tools
-sidebarTitle: Prerequisites
-description: Set up Clarinet and VS Code for Stacks development.
----
-
-
-import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';
-
-Get your development environment ready with Clarinet and the VS Code extension. These tools provide everything you need to write, test, and deploy smart contracts.
-
-## Install Clarinet
-
-
-
-```terminal !! macOS
-$ brew install clarinet
-```
-
-```terminal !! Windows
-$ winget install clarinet
-```
-
-```terminal !! Cargo
-$ sudo apt install build-essential pkg-config libssl-dev
-```
-
-```terminal !! Binary
-$ wget -nv https://github.com/hirosystems/clarinet/releases/download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz
-$ tar -xf clarinet-linux-x64.tar.gz
-$ chmod +x ./clarinet
-$ mv ./clarinet /usr/local/bin
-```
-
-
-
-Verify installation:
-
-```terminal
-$ clarinet --version
-[32mclarinet-cli 2.10.0[0m
-```
-
-## Install VS Code extension
-
-```terminal
-$ code --install-extension hirosystems.clarity-lsp
-```
-
-Or install from VS Code: Extensions panel → Search "Clarity" → Install
-
-## Configuration options
-
-| Setting | Command | Description |
-|---------|---------|-------------|
-| Shell completions | `clarinet completions ` | Enable tab completion for commands |
-| Update Clarinet | `brew upgrade clarinet` | Get the latest version (macOS) |
-| Extension settings | VS Code Settings → Clarity | Configure formatter, linting |
-
-## Test your environment
-
-Verify your setup is working correctly:
-
-```terminal
-$ clarinet new my-test && cd my-test
-[32mCreated directory[0m [1mmy-test[0m
-[32mCreated file[0m [1mClarinet.toml[0m
-
-$ clarinet contract new counter
-[32mCreated file[0m [1mcontracts/counter.clar[0m
-[32mCreated file[0m [1mtests/counter.test.ts[0m
-
-$ npm run test
-[32m✔[0m [1m0 passed[0m | 0 failed
-```
-
-## Common issues
-
-
-
- Command not found
-
-
- Check: Is Clarinet in PATH?
- Fix: Add to PATH or reinstall
-
-
-
-
-
- VS Code not highlighting
-
-
- Check: Extension installed?
- Fix: Reload window after install
-
-
-
-
-
- No auto-completion
-
-
- Check: In Clarinet project?
- Fix: Open folder with Clarinet.toml
-
-
-
-
-
-For detailed VS Code features, see the [extension guide](/tools/clarinet/vscode-extension).
-
-## Related guides
-
-- [Create your first project](/tools/clarinet/quickstart)
-- [VS Code extension features](/tools/clarinet/vscode-extension)
\ No newline at end of file
diff --git a/content/_hidden/(setting-up-your-environment)/meta.json b/content/_hidden/(setting-up-your-environment)/meta.json
deleted file mode 100644
index 83405259a..000000000
--- a/content/_hidden/(setting-up-your-environment)/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "setting-up-your-environment",
- "pages": ["installing-prerequisites", "setting-up-a-web-wallet"]
-}
diff --git a/content/_hidden/(setting-up-your-environment)/setting-up-a-web-wallet.mdx b/content/_hidden/(setting-up-your-environment)/setting-up-a-web-wallet.mdx
deleted file mode 100644
index e9811c40b..000000000
--- a/content/_hidden/(setting-up-your-environment)/setting-up-a-web-wallet.mdx
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: Setting up a web wallet
-sidebarTitle: Wallet installation
-description: Quick setup guide for Leather wallet and devnet configuration for local development
----
-
-You need a Bitcoin and Stacks wallet to interact with smart contracts during development. Leather is the most popular choice for developers—it supports both Bitcoin and Stacks, works with all major browsers, and makes switching between networks simple.
-
-This guide gets you set up with Leather and configured for local development in under 5 minutes.
-
-## What You'll Learn
-
-- Install Leather browser extension
-- Create or restore a wallet
-- Add devnet network for local development
-- Alternative wallet options
-
-## What You'll Need
-
-- Chrome, Brave, Edge, or Opera browser
-- 5 minutes for setup
-
-## Step 1: Install Leather
-
-**For Chrome, Brave, Edge, or Opera:**
-
-1. Visit the [Chrome Web Store Leather page](https://chrome.google.com/webstore/detail/leather/ldinpeekobnhjjdofggfgjlcehhmanlj)
-2. Click "Add to Chrome" (or "Get" depending on your browser)
-3. Allow the extension when prompted
-
-The extension icon appears in your browser toolbar. Click it to open Leather.
-
-**Alternative installation:**
-You can also [install from source](https://leather.io/guides/install-leather) for developer builds or testing.
-
-## Step 2: Create Your Wallet
-
-**For new users:**
-
-1. Click "Create new wallet"
-2. Write down your 12-word secret recovery phrase offline
-3. Confirm your phrase by selecting words in order
-4. Set a password for the wallet
-
-**For existing users:**
-Click "Restore wallet" and enter your existing seed phrase.
-
-Your secret recovery phrase is the only way to restore your wallet. Store it securely offline—preferably written down or engraved on metal.
-
-## Step 3: Add Devnet Network
-
-This is the key step for local development. Devnet lets you test with Clarinet's local blockchain.
-
-1. Click the overflow menu (3 dots) at top-right of Leather
-2. Select "Change network"
-3. Click "Add network"
-4. Enter these devnet details:
-
-```
-Name: Devnet
-Stacks API URL: http://localhost:3999
-Bitcoin API URL: http://localhost:18443/wallet/{wallet_id}
-```
-
-5. Click "Add network"
-6. Select "Devnet" from the network dropdown
-
-You're now connected to your local development environment. When you start Clarinet devnet, Leather will interact with your local blockchain.
-
-## Step 4: Verify Setup
-
-Test your setup:
-
-1. Switch to Devnet network in Leather
-2. You should see "Devnet" in the top-left corner
-3. Your STX balance will show 0 (normal—you'll get test tokens later)
-
-If you see any connection errors, make sure you've started `clarinet devnet` before switching to the devnet network.
-
-## Alternative Wallets
-
-**Xverse**: Another popular Bitcoin/Stacks wallet with mobile support. Follow their [complete setup guide](https://www.xverse.app/blog/how-to-set-up-an-xverse-wallet) if you prefer Xverse over Leather.
-
-**For production apps**: Support multiple wallets to give users choice. Both Leather and Xverse work with the same Stacks.js integration code.
-
-## Troubleshooting
-
-**Extension not appearing?**
-- Check if it's hidden in your browser's extensions menu
-- Pin it to your toolbar for easy access
-
-**Can't add devnet network?**
-- Double-check the URLs exactly as shown above
-- Make sure you're using `http://` not `https://`
-
-**Connection errors on devnet?**
-- Start Clarinet devnet first: `clarinet devnet`
-- Wait for all of the services to be running before verifying the setup
\ No newline at end of file
diff --git a/content/_hidden/(testing-your-contracts)/cost-analysis-and-debugging.mdx b/content/_hidden/(testing-your-contracts)/cost-analysis-and-debugging.mdx
deleted file mode 100644
index a7bba2b6d..000000000
--- a/content/_hidden/(testing-your-contracts)/cost-analysis-and-debugging.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Cost analysis and debugging
-description: Cost analysis and debugging
----
-
-## Cost analysis and debugging
\ No newline at end of file
diff --git a/content/_hidden/(testing-your-contracts)/integration-testing.mdx b/content/_hidden/(testing-your-contracts)/integration-testing.mdx
deleted file mode 100644
index bc5d75302..000000000
--- a/content/_hidden/(testing-your-contracts)/integration-testing.mdx
+++ /dev/null
@@ -1,219 +0,0 @@
----
-title: Integration testing
-description: Learn how to write and run integration tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.
----
-
-Integration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.
-
-By using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.
-
-In this guide, you will:
-
-1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)
-2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)
-3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)
-
----
-
-## Set up a Clarinet project
-
-Start by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.
-
-```terminal
-$ clarinet new stx-defi
-$ cd stx-defi
-```
-
-After changing into your project directory, run `npm install` to install the package dependencies for testing.
-
-```terminal
-$ npm install
-```
-
-We are going to use the same `defi` contract that we used in the [unit testing guide](/tools/clarinet/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:
-
-```terminal
-$ clarinet contract new defi
-```
-
-Then, inside your `defi.clar` file, copy and paste the following contract code:
-
-```clarity
-;; Error constants for various failure scenarios.
-(define-constant err-overborrow (err u300))
-
-;; The interest rate for loans, represented as 10% (out of a base of 100).
-(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate
-
-
-;; Holds the total amount of deposits in the contract, initialized to 0.
-(define-data-var total-deposits uint u0)
-
-;; Maps a user's principal address to their deposited amount.
-(define-map deposits { owner: principal } { amount: uint })
-
-;; Maps a borrower's principal address to their loan details: amount and the last interaction block.
-(define-map loans principal { amount: uint, last-interaction-block: uint })
-
-;; Public function for users to deposit STX into the contract.
-;; Updates their balance and the total deposits in the contract.
-(define-public (deposit (amount uint))
- (let
- (
- ;; Fetch the current balance or default to 0 if none exists.
- (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
- )
- ;; Transfer the STX from sender = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" to recipient = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)".
- (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
- ;; Update the user's deposit amount in the map.
- (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })
- ;; Update the total deposits variable.
- (var-set total-deposits (+ (var-get total-deposits) amount))
- ;; Return success.
- (ok true)
- )
-)
-
-;; Public function for users to borrow STX based on their deposits.
-(define-public (borrow (amount uint))
- (let
- (
- ;; Fetch user's deposit or default to 0.
- (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
- ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)
- (allowed-borrow (/ user-deposit u2))
- ;; Fetch current loan details or default to initial values.
- (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))
- ;; Calculate accrued interest on the current loan.
- (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))
- ;; Calculate the total amount due including interest.
- (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))
- ;; Calculate the new loan total after borrowing additional amount.
- (new-loan (+ amount))
- )
- ;; Ensure the requested borrow amount does not exceed the allowed amount.
- (asserts! (<= new-loan allowed-borrow) err-overborrow)
- ;; Transfer the borrowed STX to the user.
- (let
- (
- (recipient tx-sender)
- )
- (try! (as-contract (stx-transfer? amount tx-sender recipient)))
- )
- ;; Update the user's loan details in the map.
- (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })
- ;; Return success.
- (ok true)
- )
-)
-
-;; Read-only function to get the total balance by tx-sender
-(define-read-only (get-balance-by-sender)
- (ok (map-get? deposits { owner: tx-sender }))
-)
-
-;; Read-only function to get the total amount owed by the user.
-(define-read-only (get-amount-owed)
- (let
- (
- ;; Fetch current loan details or default to initial values.
- (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))
- ;; Calculate accrued interest on the current loan.
- (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))
- ;; Calculate the total amount due including interest.
- (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))
- )
- ;; Return the total amount due.
- (ok total-due)
- )
-)
-
-;; Private function to calculate the accrued interest on a loan.
-(define-private (calculate-accrued-interest (principal uint) (start-block uint))
- (let
- (
- ;; Calculate the number of blocks elapsed since the last interaction.
- (elapsed-blocks (- block-height start-block))
- ;; Calculate the interest based on the principal, rate, and elapsed time.
- (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))
- )
- ;; Ensure the loan started in the past (not at block 0).
- (asserts! (not (is-eq start-block u0)) (ok u0))
- ;; Return the calculated interest.
- (ok interest)
- )
-)
-```
-
-Run `clarinet check` to ensure that your smart contract is valid and ready for testing.
-
-
-You can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).
-
-
-## Test the deposit and borrow functionality
-
-In order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.
-
-Inside of your `defi.test.ts` file, replace the boilerplate code and add the following:
-
-```typescript
-import { describe, it, expect } from 'vitest';
-import { Cl } from '@stacks/transactions';
-
-const accounts = simnet.getAccounts();
-const wallet1 = accounts.get('wallet_1')!;
-
-describe('stx-defi', () => {
- it('borrows 10 and verifies the amount owed to be 10', () => {
- simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);
- const totalDeposits = simnet.getDataVar('defi', 'total-deposits');
- expect(totalDeposits).toBeUint(1000);
-
- simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);
- const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);
- expect(result).toBeOk(Cl.uint(10));
- });
-});
-```
-
-In this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.
-
-We start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.
-
-After making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.
-
-This handy method lets us peek at the value of data variables defined in your contract.
-
-
-To learn more about available methods for integration testing, check out the [reference page](/tools/clarinet/sdk-reference).
-
-
-To ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.
-
-With the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.
-
-After the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.
-
-Finally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:
-
-1. That our contract returned a successful Clarity response type.
-2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).
-
-These custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.
-
-## Run tests and generate coverage reports
-
-To run your tests, use:
-
-```terminal
-$ npm run test
-```
-
-To generate a coverage report, use:
-
-```terminal
-$ npm run coverage
-```
-
-This will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.
\ No newline at end of file
diff --git a/content/_hidden/(testing-your-contracts)/meta.json b/content/_hidden/(testing-your-contracts)/meta.json
deleted file mode 100644
index 9eb0a9b0f..000000000
--- a/content/_hidden/(testing-your-contracts)/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "testing-your-contracts",
- "pages": ["unit-testing", "integration-testing", "cost-analysis-and-debugging"]
-}
diff --git a/content/_hidden/(testing-your-contracts)/unit-testing.mdx b/content/_hidden/(testing-your-contracts)/unit-testing.mdx
deleted file mode 100644
index af4b18525..000000000
--- a/content/_hidden/(testing-your-contracts)/unit-testing.mdx
+++ /dev/null
@@ -1,211 +0,0 @@
----
-title: Unit testing with Clarinet JS SDK
-description: Learn how to write and run unit tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.
----
-
-import { Accordions, Accordion } from 'fumadocs-ui/components/accordion';
-
-Unit testing is the process of testing individual components or functions of smart contracts to ensure they work as expected. The Clarinet JS SDK provides a testing framework that allows you to write these tests using the Vitest testing framework, helping you catch bugs and errors early in the development process.
-
-In this guide, you will:
-
-1. [Set up a new Clarinet project with a `defi` contract](#set-up-a-new-clarinet-project).
-2. [Write a unit test covering the `deposit` function](#test-the-deposit-function).
-3. [Run tests and generate coverage reports](#run-tests-and-generate-coverage-reports).
-
----
-
-## Set up a new Clarinet project
-
-Start by creating a new project with the Clarinet CLI. The command below will create a project structure inside of `defi` with the necessary files and folders, including the Clarinet JS SDK already set up for testing.
-
-```terminal
-$ clarinet new stx-defi
-$ cd stx-defi
-```
-
-After changing into your project directory, run `npm install` to install the package dependencies for testing.
-
-```terminal
-$ npm install
-```
-
-Since the smart contract code is out of scope for this guide, we are going to use a pre-existing contract. First, generate a new file using the `clarinet contract new` command in order to set up your project with the necessary configuration and test files.
-
-```terminal
-$ clarinet contract new defi
-```
-
-Now, inside your `defi.clar` file, copy and paste the following contract code:
-
-```clarity
-;; Holds the total amount of deposits in the contract, initialized to 0.
-(define-data-var total-deposits uint u0)
-
-;; Maps a user's principal address to their deposited amount.
-(define-map deposits { owner: principal } { amount: uint })
-
-;; Public function for users to deposit STX into the contract.
-;; Updates their balance and the total deposits in the contract.
-(define-public (deposit (amount uint))
- (let
- (
- ;; Fetch the current balance or default to 0 if none exists.
- (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
- )
- ;; Transfer the STX from sender = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" to recipient = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)".
- (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
- ;; Update the user's deposit amount in the map.
- (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })
- ;; Update the total deposits variable.
- (var-set total-deposits (+ (var-get total-deposits) amount))
- ;; Return success.
- (ok true)
- )
-)
-
-;; Read-only function to get the total balance by tx-sender
-(define-read-only (get-balance-by-sender)
- (ok (map-get? deposits { owner: tx-sender }))
-)
-```
-
-Run `clarinet check` to ensure that your smart contract is valid and ready for testing.
-
-
-You can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).
-
-
-## Test the deposit function
-
-This `deposit` function allows users to deposit STX into the contract, updating their balance inside a `deposits` map and adding to the total deposits stored in a `total-deposits` variable. The key tests we want to cover are that the deposit is successful and that the user's balance, as well as the contract's total deposits, are updated correctly.
-
-Inside of your `defi.test.ts` file, replace the boilerplate code and add the following:
-
-```typescript
-import { describe, it, expect } from 'vitest';
-import { Cl } from '@stacks/transactions';
-
-const accounts = simnet.getAccounts();
-const wallet1 = accounts.get('wallet_1')!;
-```
-
-These imports provide the testing framework and utilities we need. We also get the `wallet_1` account, which will act as our test user.
-
-Next, define the test suite and the specific test case:
-
-```typescript
-describe('stx-defi', () => {
- it('allows users to deposit STX', () => {
- // Test code will go here
- });
-});
-```
-
-This structure comes from our Vitest integration, and it organizes our tests and describes what we're testing. The `describe` block groups multiple test cases together, while the `it` block represents a single test case.
-
-Now, let's simulate a deposit. Inside of the `it` block, define the amount to deposit and call the `deposit` function:
-
-```typescript
-const amount = 1000;
-const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);
-```
-
-This code simulates a deposit by calling the `deposit` function, using the `callPublicFn` method from the Clarinet JS SDK, in our contract with a specified amount, just as a user would in the real world.
-
-After making the deposit, create an assertion to verify that the call itself was successful and returns an `ok` response type with the value `true`:
-
-```typescript
-expect(deposit.result).toBeOk(Cl.bool(true));
-```
-
-Run `npm run test` to confirm that this test passes.
-
-Let's go over some of the code in this assertion:
-
-- `expect` is a function from Vitest that makes an assertion about the value we expect to get back from the `deposit` function.
-
-But how do we test against Clarity types and values? This is where the `Cl` and `toBeOk` helpers come in.
-
-- `toBeOk` is a custom matcher function built into Vitest that checks if the result of the deposit call is an `Ok` response, which is a Clarity type. This is important because it confirms that the deposit transaction was processed successfully.
-- `Cl` helper is from the `@stacks/transactions` package and is used to create Clarity values in JavaScript. In this case, it's used to create a Clarity boolean with the value of `true`.
-
-
-To see more custom matcher examples, check out the [reference page](/tools/clarinet/sdk-reference).
-
-
-Once we can confirm that the deposit was successful, write a test to verify that the contract's total deposits have been updated correctly.
-
-```typescript
-const totalDeposits = simnet.getDataVar('defi', 'total-deposits');
-expect(totalDeposits).toBeUint(amount);
-```
-
-Run `npm run test` again to confirm that this test also passes.
-
-This check ensures that the contract accepted our deposit without any issues.
-
-Lastly, verify that the user's balance has been updated correctly:
-
-```typescript
-const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);
-expect(balance.result).toBeOk(
- Cl.some(
- Cl.tuple({
- amount: Cl.uint(amount),
- })
- )
-);
-```
-
-We call the `get-balance-by-sender` function and check if it matches the amount we just deposited.
-
-By following these steps, our test comprehensively verifies that the `deposit` function works as intended, updating individual balances and total deposits accurately.
-
-
-
-```typescript
- import { describe, it, expect } from 'vitest';
- import { Cl } from '@stacks/transactions';
-
- const accounts = simnet.getAccounts();
- const wallet1 = accounts.get('wallet_1')!;
-
- describe('stx-defi', () => {
- it('allows users to deposit STX', () => {
- const amount = 1000;
- const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);
- expect(deposit.result).toBeOk(Cl.bool(true));
-
- const totalDeposits = simnet.getDataVar('defi', 'total-deposits');
- expect(totalDeposits).toBeUint(amount);
-
- const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);
- expect(balance.result).toBeOk(
- Cl.some(
- Cl.tuple({
- amount: Cl.uint(amount),
- })
- )
- );
- });
- });
-```
-
-
-
-## Run tests and generate coverage reports
-
-To run your tests, use:
-
-```terminal
-$ npm run test
-```
-
-To generate a coverage report, use:
-
-```terminal
-$ npm run coverage
-```
-
-This will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.
\ No newline at end of file
diff --git a/content/_hidden/(working-with-hiro-apis)/api-fundamentals.mdx b/content/_hidden/(working-with-hiro-apis)/api-fundamentals.mdx
deleted file mode 100644
index 6cca08d2c..000000000
--- a/content/_hidden/(working-with-hiro-apis)/api-fundamentals.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: API fundamentals
-description: API fundamentals
----
-
-## API fundamentals
\ No newline at end of file
diff --git a/content/_hidden/(working-with-hiro-apis)/backend-integration-patterns.mdx b/content/_hidden/(working-with-hiro-apis)/backend-integration-patterns.mdx
deleted file mode 100644
index 7f8f285b7..000000000
--- a/content/_hidden/(working-with-hiro-apis)/backend-integration-patterns.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Backend integration patterns
-description: Backend integration patterns
----
-
-## Backend integration patterns
\ No newline at end of file
diff --git a/content/_hidden/(working-with-hiro-apis)/meta.json b/content/_hidden/(working-with-hiro-apis)/meta.json
deleted file mode 100644
index 08d4bb9fd..000000000
--- a/content/_hidden/(working-with-hiro-apis)/meta.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "title": "working-with-hiro-apis",
- "pages": ["api-fundamentals", "backend-integration-patterns"]
-}
diff --git a/content/_hidden/features.mdx b/content/_hidden/features.mdx
deleted file mode 100644
index 0a13ebb57..000000000
--- a/content/_hidden/features.mdx
+++ /dev/null
@@ -1,149 +0,0 @@
----
-title: Introduction to Hiro tools
-sidebarTitle: Introduction to Hiro tools
-description: Learn more about our tools and how to use them together.
-isNew: true
----
-
-
-
-## Overview
-
-Core tools for building and testing smart contracts:
-
-- [**Clarinet**](/tools/clarinet) - Local blockchain development environment
-- [**Clarinet JS SDK**](/tools/clarinet/sdk-introduction) - JavaScript testing framework
-- [**Stacks.js**](/reference/stacks.js) - Frontend integration library
-- [**Chainhook**](/tools/chainhook) - Event-driven blockchain applications
-
-## API services
-
-Query blockchain data without running infrastructure:
-
-- [**Stacks Blockchain API**](/apis/stacks-blockchain-api) - RESTful blockchain queries
-- [**Token Metadata API**](/apis/token-metadata-api) - NFT and token metadata
-- [**Ordinals API**](/apis/ordinals-api) - Bitcoin inscriptions data
-- [**Runes API**](/apis/runes-api) - Bitcoin fungible tokens
-
-## Platform services
-
-Cloud-based tools for teams and production:
-
-- [**Hiro Platform**](https://platform.hiro.so) - Cloud development environment
-- [**Contract Monitoring**](/tools/contract-monitoring) - Real-time alerts and metrics
-- **Hosted Devnets** - Isolated test environments
-
-## Integrations
-
-How our tools connect and complement each other:
-
-| Tool | Integrates With | How They Work Together |
-|------------|-----------------|-----------------------------------------------|
-| Clarinet | Stacks.js | Deploy contracts locally, connect frontend |
-| Clarinet | Chainhook | Test event handling in development |
-| Stacks.js | Stacks API | Submit transactions, query results |
-
-## Development workflows
-
-### Smart contract DApp
-
-Building user-facing applications with smart contracts:
-
-```terminal
-$ clarinet new my-project && cd my-project
-$ clarinet contract new token
-$ clarinet test
-
-$ clarinet devnet start
-$ clarinet deployments apply --devnet
-```
-
-```typescript
-import { request } from '@stacks/connect';
-
-const response = await request('stx_callContract', {
- contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters',
- functionName: 'count',
- functionArgs: [Cl.int(3)],
- network: 'mainnet',
-});
-
-const balance = await fetch(
- 'https://api.hiro.so/v2/accounts/ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'
-);
-```
-
-**Tool flow**: Clarinet → Stacks.js → Stacks API
-
-### Event-driven backend
-
-React to blockchain events in real-time:
-
-```json
-// 1. Create Chainhook predicate
-{
- "chain": "stacks",
- "uuid": "my-hook",
- "networks": {
- "mainnet": {
- "if_this": {
- "scope": "contract_call",
- "method": "transfer"
- },
- "then_that": {
- "http_post": {
- "url": "https://my-api.com/webhook"
- }
- }
- }
- }
-}
-```
-
-```javascript
-// 2. Handle webhook in your backend
-app.post('/webhook', (req, res) => {
- const { apply } = req.body;
- const transactions = apply[0].transactions;
- // Process event, update database
- db.save(transactions);
-});
-```
-
-**Tool flow**: Chainhook → Your backend
-
-### Bitcoin applications
-
-Build on Bitcoin L1 protocols:
-
-```bash
-# 1. Query existing data
-curl https://api.hiro.so/ordinals/v1/inscriptions
-
-# 2. Or create custom indexes
-bitcoin-indexer --config my-protocol.json
-```
-
-```typescript
-// 3. Display in frontend
-const inscriptions = await fetch(
- 'https://api.hiro.so/ordinals/v1/inscriptions'
-);
-```
-
-**Tool flow**: Ordinals / Runes APIs / Bitcoin Indexer → Your backend
-
-## Decision matrix
-
-| If You're Building | Use These Tools | Why |
-|------------------------|------------------------------------------|-----------------------------------|
-| Smart contract app | Clarinet + Stacks.js + API | Complete dev-to-production flow |
-| NFT marketplace | Clarinet + Stacks.js + API + Token Metadata API | Automatic metadata handling |
-| Bitcoin explorer | Ordinals/Runes APIs | Pre-indexed Bitcoin data |
-| Analytics dashboard | APIs + Chainhook | Historical + real-time data |
-| Custom protocol | Chainhook + Bitcoin Indexer | Build your own indexes |
-
-:::next-steps
-- [Install Clarinet](/tools/clarinet/getting-started/installing-clarinet): Learn how to install Clarinet.
-- [Explore API references](/apis): Explore our API references.
-:::
\ No newline at end of file
diff --git a/content/_hidden/recommended-resources.mdx b/content/_hidden/recommended-resources.mdx
deleted file mode 100644
index faa4bcd63..000000000
--- a/content/_hidden/recommended-resources.mdx
+++ /dev/null
@@ -1,112 +0,0 @@
----
-title: Recommended resources
-description: Here's a list of recommended content to further expand your knowledge in this amazing tool.
-full: true
----
-
-import { Card as MainCard, SecondaryCard, SmallCard } from '@/components/card';
-import { PageFooter } from '@/components/footer';
-import { Book, Play, Lightbulb, FileText, Key, Send, Webhook, Timer, ExternalLink } from 'lucide-react';
-
-## Guides
-
-
- }
- tag="Guide"
- description="Learn how to integrate, build, and extend functionality with practical, developer-focused guidance."
-/>
- }
- tag="Quickstart"
- description="Get started fast with the basics you need to set up and run your first project."
-/>
- }
- tag="Concepts"
- description="Understand the core ideas, principles, and mental models behind the system."
-/>
- }
- tag="Tutorial"
- description="A hands-on walkthrough to help you accomplish a specific task from start to finish."
-/>
-
-
-## Snippets/Recipes
-
-
- }
- tag="Authentication"
- description="Learn how to securely authenticate API requests using access tokens."
-/>
- }
- tag="Transactions"
- description="Step-by-step guide to submit transactions using REST API endpoints."
-/>
- }
- tag="Events"
- description="Set up webhooks to listen for and respond to blockchain events in real-time."
-/>
- }
- tag="Best Practices"
- description="Implement proper rate limiting and retry logic in your applications."
-/>
-
-
-## Project templates
-
-To learn more about these concepts, check out these resources:
-
-- [Deep dive on Concept #1 ](https://example.com/concept-1)
-- [Video tutorial on Concept #2 ](https://example.com/concept-2)
-- [Clarity reference for functions ](https://example.com/clarity-reference)
-- [Stacks documentation for PoX ](https://example.com/pox-docs)
-
-## Blog posts
-
-To learn more about these concepts, check out these resources:
-
-- [Deep dive on Concept #1 ](https://example.com/blog/concept-1)
-- [Video tutorial on Concept #2 ](https://example.com/blog/concept-2)
-- [Clarity reference for functions ](https://example.com/blog/clarity-reference)
-- [Stacks documentation for PoX ](https://example.com/blog/pox-docs)
-
-
-## Videos
-
-To learn more about these concepts, check out these resources:
-
-- [Deep dive on Concept #1 ](https://example.com/videos/concept-1)
-- [Video tutorial on Concept #2 ](https://example.com/videos/concept-2)
-- [Clarity reference for functions ](https://example.com/videos/clarity-reference)
-- [Stacks documentation for PoX ](https://example.com/videos/pox-docs)
-
-## e-Books
-
-To learn more about these concepts, check out these resources:
-
-- [Deep dive on Concept #1 ](https://example.com/ebooks/concept-1)
-- [Video tutorial on Concept #2 ](https://example.com/ebooks/concept-2)
-- [Clarity reference for functions ](https://example.com/ebooks/clarity-reference)
-- [Stacks documentation for PoX ](https://example.com/ebooks/pox-docs)
\ No newline at end of file
diff --git a/content/docs/apis/stacks-blockchain-api/reference/fees/meta.json b/content/docs/apis/stacks-blockchain-api/reference/fees/meta.json
deleted file mode 100644
index 5e2525275..000000000
--- a/content/docs/apis/stacks-blockchain-api/reference/fees/meta.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "title": "Fees",
- "pages": ["fee-rate", "estimate", "transfer-estimate"],
- "defaultOpen": false
-}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/meta.json b/content/docs/apis/stacks-blockchain-api/reference/nakamoto/meta.json
deleted file mode 100644
index 7312774f5..000000000
--- a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/meta.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "title": "Nakamoto",
- "pages": ["nakamoto-block", "tenure-blocks", "tenure-metadata", "tenure-fork-info", "tenure-tip"],
- "defaultOpen": false
-}
diff --git a/content/docs/apis/ordinals-api/index.mdx b/content/docs/en/apis/ordinals-api/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/index.mdx
rename to content/docs/en/apis/ordinals-api/index.mdx
diff --git a/content/docs/apis/ordinals-api/meta.json b/content/docs/en/apis/ordinals-api/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/meta.json
rename to content/docs/en/apis/ordinals-api/meta.json
diff --git a/content/docs/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/index.mdx b/content/docs/en/apis/ordinals-api/reference/brc20/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/index.mdx
rename to content/docs/en/apis/ordinals-api/reference/brc20/index.mdx
diff --git a/content/docs/apis/ordinals-api/reference/brc20/meta.json b/content/docs/en/apis/ordinals-api/reference/brc20/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/brc20/meta.json
rename to content/docs/en/apis/ordinals-api/reference/brc20/meta.json
diff --git a/content/docs/apis/ordinals-api/reference/info/index.mdx b/content/docs/en/apis/ordinals-api/reference/info/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/info/index.mdx
rename to content/docs/en/apis/ordinals-api/reference/info/index.mdx
diff --git a/content/docs/apis/ordinals-api/reference/info/meta.json b/content/docs/en/apis/ordinals-api/reference/info/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/info/meta.json
rename to content/docs/en/apis/ordinals-api/reference/info/meta.json
diff --git a/content/docs/apis/ordinals-api/reference/info/status.mdx b/content/docs/en/apis/ordinals-api/reference/info/status.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/info/status.mdx
rename to content/docs/en/apis/ordinals-api/reference/info/status.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/get-inscription.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/get-inscription.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/index.mdx b/content/docs/en/apis/ordinals-api/reference/inscriptions/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/index.mdx
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/index.mdx
diff --git a/content/docs/apis/ordinals-api/reference/inscriptions/meta.json b/content/docs/en/apis/ordinals-api/reference/inscriptions/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/inscriptions/meta.json
rename to content/docs/en/apis/ordinals-api/reference/inscriptions/meta.json
diff --git a/content/docs/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx b/content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx
rename to content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx
diff --git a/content/docs/apis/ordinals-api/reference/satoshis/get-satoshi.mdx b/content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/satoshis/get-satoshi.mdx
rename to content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi.mdx
diff --git a/content/docs/apis/ordinals-api/reference/satoshis/index.mdx b/content/docs/en/apis/ordinals-api/reference/satoshis/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/satoshis/index.mdx
rename to content/docs/en/apis/ordinals-api/reference/satoshis/index.mdx
diff --git a/content/docs/apis/ordinals-api/reference/satoshis/meta.json b/content/docs/en/apis/ordinals-api/reference/satoshis/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/satoshis/meta.json
rename to content/docs/en/apis/ordinals-api/reference/satoshis/meta.json
diff --git a/content/docs/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx b/content/docs/en/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx
rename to content/docs/en/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx
diff --git a/content/docs/apis/ordinals-api/reference/statistics/index.mdx b/content/docs/en/apis/ordinals-api/reference/statistics/index.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/statistics/index.mdx
rename to content/docs/en/apis/ordinals-api/reference/statistics/index.mdx
diff --git a/content/docs/apis/ordinals-api/reference/statistics/meta.json b/content/docs/en/apis/ordinals-api/reference/statistics/meta.json
similarity index 100%
rename from content/docs/apis/ordinals-api/reference/statistics/meta.json
rename to content/docs/en/apis/ordinals-api/reference/statistics/meta.json
diff --git a/content/docs/apis/ordinals-api/usage.mdx b/content/docs/en/apis/ordinals-api/usage.mdx
similarity index 100%
rename from content/docs/apis/ordinals-api/usage.mdx
rename to content/docs/en/apis/ordinals-api/usage.mdx
diff --git a/content/docs/apis/platform-api/index.mdx b/content/docs/en/apis/platform-api/index.mdx
similarity index 100%
rename from content/docs/apis/platform-api/index.mdx
rename to content/docs/en/apis/platform-api/index.mdx
diff --git a/content/docs/apis/platform-api/meta.json b/content/docs/en/apis/platform-api/meta.json
similarity index 100%
rename from content/docs/apis/platform-api/meta.json
rename to content/docs/en/apis/platform-api/meta.json
diff --git a/content/docs/apis/platform-api/reference/chainhooks/create.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/create.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/create.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/create.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/delete.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/delete.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/delete.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/delete.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/get.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/get.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/get.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/get.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/index.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/index.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/index.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/index.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/list.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/list.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/list.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/list.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/meta.json b/content/docs/en/apis/platform-api/reference/chainhooks/meta.json
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/meta.json
rename to content/docs/en/apis/platform-api/reference/chainhooks/meta.json
diff --git a/content/docs/apis/platform-api/reference/chainhooks/status.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/status.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/status.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/status.mdx
diff --git a/content/docs/apis/platform-api/reference/chainhooks/update.mdx b/content/docs/en/apis/platform-api/reference/chainhooks/update.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/chainhooks/update.mdx
rename to content/docs/en/apis/platform-api/reference/chainhooks/update.mdx
diff --git a/content/docs/apis/platform-api/reference/devnet/bitcoin-node.mdx b/content/docs/en/apis/platform-api/reference/devnet/bitcoin-node.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/bitcoin-node.mdx
rename to content/docs/en/apis/platform-api/reference/devnet/bitcoin-node.mdx
diff --git a/content/docs/apis/platform-api/reference/devnet/index.mdx b/content/docs/en/apis/platform-api/reference/devnet/index.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/index.mdx
rename to content/docs/en/apis/platform-api/reference/devnet/index.mdx
diff --git a/content/docs/apis/platform-api/reference/devnet/meta.json b/content/docs/en/apis/platform-api/reference/devnet/meta.json
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/meta.json
rename to content/docs/en/apis/platform-api/reference/devnet/meta.json
diff --git a/content/docs/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx b/content/docs/en/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx
rename to content/docs/en/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx
diff --git a/content/docs/apis/platform-api/reference/devnet/start.mdx b/content/docs/en/apis/platform-api/reference/devnet/start.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/start.mdx
rename to content/docs/en/apis/platform-api/reference/devnet/start.mdx
diff --git a/content/docs/apis/platform-api/reference/devnet/stop.mdx b/content/docs/en/apis/platform-api/reference/devnet/stop.mdx
similarity index 100%
rename from content/docs/apis/platform-api/reference/devnet/stop.mdx
rename to content/docs/en/apis/platform-api/reference/devnet/stop.mdx
diff --git a/content/docs/apis/platform-api/usage.mdx b/content/docs/en/apis/platform-api/usage.mdx
similarity index 100%
rename from content/docs/apis/platform-api/usage.mdx
rename to content/docs/en/apis/platform-api/usage.mdx
diff --git a/content/docs/apis/runes-api/index.mdx b/content/docs/en/apis/runes-api/index.mdx
similarity index 100%
rename from content/docs/apis/runes-api/index.mdx
rename to content/docs/en/apis/runes-api/index.mdx
diff --git a/content/docs/apis/runes-api/meta.json b/content/docs/en/apis/runes-api/meta.json
similarity index 100%
rename from content/docs/apis/runes-api/meta.json
rename to content/docs/en/apis/runes-api/meta.json
diff --git a/content/docs/apis/runes-api/reference/activities/activity.mdx b/content/docs/en/apis/runes-api/reference/activities/activity.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/activity.mdx
rename to content/docs/en/apis/runes-api/reference/activities/activity.mdx
diff --git a/content/docs/apis/runes-api/reference/activities/for-address.mdx b/content/docs/en/apis/runes-api/reference/activities/for-address.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/for-address.mdx
rename to content/docs/en/apis/runes-api/reference/activities/for-address.mdx
diff --git a/content/docs/apis/runes-api/reference/activities/for-block.mdx b/content/docs/en/apis/runes-api/reference/activities/for-block.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/for-block.mdx
rename to content/docs/en/apis/runes-api/reference/activities/for-block.mdx
diff --git a/content/docs/apis/runes-api/reference/activities/for-transaction.mdx b/content/docs/en/apis/runes-api/reference/activities/for-transaction.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/for-transaction.mdx
rename to content/docs/en/apis/runes-api/reference/activities/for-transaction.mdx
diff --git a/content/docs/apis/runes-api/reference/activities/index.mdx b/content/docs/en/apis/runes-api/reference/activities/index.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/index.mdx
rename to content/docs/en/apis/runes-api/reference/activities/index.mdx
diff --git a/content/docs/apis/runes-api/reference/activities/meta.json b/content/docs/en/apis/runes-api/reference/activities/meta.json
similarity index 100%
rename from content/docs/apis/runes-api/reference/activities/meta.json
rename to content/docs/en/apis/runes-api/reference/activities/meta.json
diff --git a/content/docs/apis/runes-api/reference/balances/address.mdx b/content/docs/en/apis/runes-api/reference/balances/address.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/balances/address.mdx
rename to content/docs/en/apis/runes-api/reference/balances/address.mdx
diff --git a/content/docs/apis/runes-api/reference/balances/holder-balance.mdx b/content/docs/en/apis/runes-api/reference/balances/holder-balance.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/balances/holder-balance.mdx
rename to content/docs/en/apis/runes-api/reference/balances/holder-balance.mdx
diff --git a/content/docs/apis/runes-api/reference/balances/holders.mdx b/content/docs/en/apis/runes-api/reference/balances/holders.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/balances/holders.mdx
rename to content/docs/en/apis/runes-api/reference/balances/holders.mdx
diff --git a/content/docs/apis/runes-api/reference/balances/index.mdx b/content/docs/en/apis/runes-api/reference/balances/index.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/balances/index.mdx
rename to content/docs/en/apis/runes-api/reference/balances/index.mdx
diff --git a/content/docs/apis/runes-api/reference/balances/meta.json b/content/docs/en/apis/runes-api/reference/balances/meta.json
similarity index 100%
rename from content/docs/apis/runes-api/reference/balances/meta.json
rename to content/docs/en/apis/runes-api/reference/balances/meta.json
diff --git a/content/docs/apis/runes-api/reference/etchings/get-etching.mdx b/content/docs/en/apis/runes-api/reference/etchings/get-etching.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/etchings/get-etching.mdx
rename to content/docs/en/apis/runes-api/reference/etchings/get-etching.mdx
diff --git a/content/docs/apis/runes-api/reference/etchings/get-etchings.mdx b/content/docs/en/apis/runes-api/reference/etchings/get-etchings.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/etchings/get-etchings.mdx
rename to content/docs/en/apis/runes-api/reference/etchings/get-etchings.mdx
diff --git a/content/docs/apis/runes-api/reference/etchings/index.mdx b/content/docs/en/apis/runes-api/reference/etchings/index.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/etchings/index.mdx
rename to content/docs/en/apis/runes-api/reference/etchings/index.mdx
diff --git a/content/docs/apis/runes-api/reference/etchings/meta.json b/content/docs/en/apis/runes-api/reference/etchings/meta.json
similarity index 100%
rename from content/docs/apis/runes-api/reference/etchings/meta.json
rename to content/docs/en/apis/runes-api/reference/etchings/meta.json
diff --git a/content/docs/apis/runes-api/reference/info/index.mdx b/content/docs/en/apis/runes-api/reference/info/index.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/info/index.mdx
rename to content/docs/en/apis/runes-api/reference/info/index.mdx
diff --git a/content/docs/apis/runes-api/reference/info/meta.json b/content/docs/en/apis/runes-api/reference/info/meta.json
similarity index 100%
rename from content/docs/apis/runes-api/reference/info/meta.json
rename to content/docs/en/apis/runes-api/reference/info/meta.json
diff --git a/content/docs/apis/runes-api/reference/info/status.mdx b/content/docs/en/apis/runes-api/reference/info/status.mdx
similarity index 100%
rename from content/docs/apis/runes-api/reference/info/status.mdx
rename to content/docs/en/apis/runes-api/reference/info/status.mdx
diff --git a/content/docs/apis/runes-api/usage.mdx b/content/docs/en/apis/runes-api/usage.mdx
similarity index 100%
rename from content/docs/apis/runes-api/usage.mdx
rename to content/docs/en/apis/runes-api/usage.mdx
diff --git a/content/docs/apis/signer-metrics-api/index.mdx b/content/docs/en/apis/signer-metrics-api/index.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/index.mdx
rename to content/docs/en/apis/signer-metrics-api/index.mdx
diff --git a/content/docs/apis/signer-metrics-api/meta.json b/content/docs/en/apis/signer-metrics-api/meta.json
similarity index 100%
rename from content/docs/apis/signer-metrics-api/meta.json
rename to content/docs/en/apis/signer-metrics-api/meta.json
diff --git a/content/docs/apis/signer-metrics-api/reference/block-proposals/index.mdx b/content/docs/en/apis/signer-metrics-api/reference/block-proposals/index.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/block-proposals/index.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/block-proposals/index.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/block-proposals/meta.json b/content/docs/en/apis/signer-metrics-api/reference/block-proposals/meta.json
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/block-proposals/meta.json
rename to content/docs/en/apis/signer-metrics-api/reference/block-proposals/meta.json
diff --git a/content/docs/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx b/content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx b/content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx b/content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx b/content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/blocks/index.mdx b/content/docs/en/apis/signer-metrics-api/reference/blocks/index.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/blocks/index.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/blocks/index.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/blocks/meta.json b/content/docs/en/apis/signer-metrics-api/reference/blocks/meta.json
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/blocks/meta.json
rename to content/docs/en/apis/signer-metrics-api/reference/blocks/meta.json
diff --git a/content/docs/apis/signer-metrics-api/reference/info/index.mdx b/content/docs/en/apis/signer-metrics-api/reference/info/index.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/info/index.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/info/index.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/info/meta.json b/content/docs/en/apis/signer-metrics-api/reference/info/meta.json
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/info/meta.json
rename to content/docs/en/apis/signer-metrics-api/reference/info/meta.json
diff --git a/content/docs/apis/signer-metrics-api/reference/info/status.mdx b/content/docs/en/apis/signer-metrics-api/reference/info/status.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/info/status.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/info/status.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/signers/index.mdx b/content/docs/en/apis/signer-metrics-api/reference/signers/index.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/signers/index.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/signers/index.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/signers/meta.json b/content/docs/en/apis/signer-metrics-api/reference/signers/meta.json
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/signers/meta.json
rename to content/docs/en/apis/signer-metrics-api/reference/signers/meta.json
diff --git a/content/docs/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx b/content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx
diff --git a/content/docs/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx b/content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx
rename to content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx
diff --git a/content/docs/apis/signer-metrics-api/usage.mdx b/content/docs/en/apis/signer-metrics-api/usage.mdx
similarity index 100%
rename from content/docs/apis/signer-metrics-api/usage.mdx
rename to content/docs/en/apis/signer-metrics-api/usage.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/architecture.mdx b/content/docs/en/apis/stacks-blockchain-api/architecture.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/architecture.mdx
rename to content/docs/en/apis/stacks-blockchain-api/architecture.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/index.mdx b/content/docs/en/apis/stacks-blockchain-api/index.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/index.mdx
rename to content/docs/en/apis/stacks-blockchain-api/index.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/meta.json b/content/docs/en/apis/stacks-blockchain-api/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/nonce-handling.mdx b/content/docs/en/apis/stacks-blockchain-api/nonce-handling.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/nonce-handling.mdx
rename to content/docs/en/apis/stacks-blockchain-api/nonce-handling.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/pagination.mdx b/content/docs/en/apis/stacks-blockchain-api/pagination.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/pagination.mdx
rename to content/docs/en/apis/stacks-blockchain-api/pagination.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/assets.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/assets.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/assets.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/assets.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/balances.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/balances.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/balances.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/balances.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/meta.json
similarity index 95%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/meta.json
index 9cab8049c..ba89d31c7 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/accounts/meta.json
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/meta.json
@@ -1,7 +1,6 @@
{
"title": "Accounts",
"pages": [
- "info",
"assets",
"balances",
"stx-balances",
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/average-times.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/average-times.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/average-times.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/average-times.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/get-block.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/get-block.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/meta.json
similarity index 71%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/meta.json
index e32757d45..eb56eed30 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/blocks/meta.json
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/meta.json
@@ -8,11 +8,8 @@
"recent-blocks",
"block-by-hash",
"block-by-height",
- "block-by-height-v3",
"block-by-burn-block-hash",
- "block-by-burn-block-height",
- "block-proposal",
- "upload-block"
+ "block-by-burn-block-height"
],
"defaultOpen": false
}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/burn-blocks/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/burn-blocks/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/faucets/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/faucets/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/faucets/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/faucets/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/faucets/stx.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/faucets/stx.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/faucets/stx.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/faucets/stx.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx
diff --git a/content/docs/en/apis/stacks-blockchain-api/reference/fees/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/fees/meta.json
new file mode 100644
index 000000000..4dae7e68c
--- /dev/null
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/fees/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Fees",
+ "pages": ["fee-rate"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/info/meta.json
similarity index 91%
rename from content/docs/apis/stacks-blockchain-api/reference/info/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/meta.json
index 719c88059..00dc4199c 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/info/meta.json
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/info/meta.json
@@ -2,8 +2,6 @@
"title": "Info",
"pages": [
"status",
- "core-api",
- "health",
"network-block-time",
"network-given-block-time",
"total-and-unlocked-stx-supply",
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/network-block-time.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/network-block-time.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/network-block-time.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/network-block-time.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/status.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/status.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/status.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/status.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/mempool/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/mempool/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/mempool/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/mempool/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/names/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/name-details.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/name-details.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/name-details.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/name-details.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/names.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/names.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/names.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/names.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/namespace-names.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/namespace-names.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/namespace-names.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/namespace-names.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/namespaces.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/namespaces.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/namespaces.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/namespaces.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json
similarity index 61%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json
index f5216f411..f62e46c27 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/meta.json
@@ -5,10 +5,7 @@
"cycle",
"signers-in-cycle",
"signer-in-cycle",
- "signer-details",
- "stackers-for-signer-in-cycle",
- "pox-details",
- "stacker-set"
+ "stackers-for-signer-in-cycle"
],
"defaultOpen": false
}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/search/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/search/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/search/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/search/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/search/search-by-id.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/search/search-by-id.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/search/search-by-id.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/search/search-by-id.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx
diff --git a/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/meta.json
new file mode 100644
index 000000000..72880557e
--- /dev/null
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Smart Contracts",
+ "pages": ["status", "info", "by-trait", "events"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-pool/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-pool/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-pool/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-pool/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/tokens/holders.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/tokens/holders.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/tokens/holders.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/tokens/holders.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/tokens/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/tokens/meta.json
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/tokens/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/tokens/meta.json
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/meta.json b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/meta.json
similarity index 82%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/meta.json
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/meta.json
index 13acd6526..59f10ae9b 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/transactions/meta.json
+++ b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/meta.json
@@ -4,7 +4,6 @@
"recent-transactions",
"get-transaction",
"get-raw-transaction",
- "transaction-details-v3",
"address-transactions",
"transactions-by-block",
"events-for-an-address-transaction",
@@ -13,8 +12,7 @@
"mempool-transactions",
"dropped-mempool-transactions",
"statistics-for-mempool-transactions",
- "details-for-transactions",
- "broadcast-transaction"
+ "details-for-transactions"
],
"defaultOpen": false
}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx b/content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx
rename to content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/requesting-proofs.mdx b/content/docs/en/apis/stacks-blockchain-api/requesting-proofs.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/requesting-proofs.mdx
rename to content/docs/en/apis/stacks-blockchain-api/requesting-proofs.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/usage.mdx b/content/docs/en/apis/stacks-blockchain-api/usage.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/usage.mdx
rename to content/docs/en/apis/stacks-blockchain-api/usage.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/index.mdx b/content/docs/en/apis/stacks-node-rpc-api/index.mdx
new file mode 100644
index 000000000..dee945d52
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/index.mdx
@@ -0,0 +1,29 @@
+---
+title: Stacks Node RPC API
+sidebarTitle: Overview
+description: Direct RPC access to Stacks blockchain nodes for real-time data and operations.
+llm: false
+---
+
+## Overview
+
+The Stacks Node RPC API provides direct access to Stacks blockchain nodes through RPC endpoints. **Hiro proxies these calls to upstream Stacks nodes** - we don't maintain or control the nodes themselves, so performance and availability depend on upstream blockchain infrastructure.
+
+## Key features
+
+- **Raw blockchain node methods** - Submit transactions, call read-only contracts, query mempool/state
+- **Real-time blockchain state** - No caching layers, direct node responses
+- **Smart contract execution** - Execute read-only functions and retrieve contract state
+- **Transaction broadcasting** - Submit transactions directly to the network
+
+## Usage
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' -H 'Accept: application/json'
+```
+
+For more usage examples and rate limiting information, see [Usage](/apis/stacks-node-rpc-api/usage).
+
+:::callout
+**REST vs RPC:** Use [Stacks Blockchain API](/apis/stacks-blockchain-api) for cached, indexed blockchain data (balances, transactions, events). Use RPC endpoints for raw node operations and real-time blockchain state queries.
+:::
\ No newline at end of file
diff --git a/content/docs/en/apis/stacks-node-rpc-api/meta.json b/content/docs/en/apis/stacks-node-rpc-api/meta.json
new file mode 100644
index 000000000..4c84cf1fc
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "APIs",
+ "root": true,
+ "pages": ["---Stacks Node RPC API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/accounts/info.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/accounts/info.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/accounts/info.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/accounts/info.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/accounts/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/accounts/meta.json
new file mode 100644
index 000000000..24286ac17
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/accounts/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Accounts",
+ "pages": ["info"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/meta.json
new file mode 100644
index 000000000..ae4afee3a
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Blocks",
+ "pages": ["block-by-height-v3", "block-proposal", "upload-block"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/fees/estimate.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/fees/estimate.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/fees/estimate.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/fees/estimate.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/fees/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/fees/meta.json
new file mode 100644
index 000000000..b14707173
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/fees/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Fees",
+ "pages": ["estimate", "transfer-estimate"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/core-api.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/info/core-api.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/core-api.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/info/core-api.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/info/health.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/info/health.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/info/health.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/info/health.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/info/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/info/meta.json
new file mode 100644
index 000000000..60430a09b
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/info/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Info",
+ "pages": ["core-api", "health"],
+ "defaultOpen": false
+}
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/meta.json
new file mode 100644
index 000000000..be2914109
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Nakamoto",
+ "pages": ["nakamoto-block", "tenure-blocks", "tenure-fork-info", "tenure-metadata", "tenure-tip"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/meta.json
new file mode 100644
index 000000000..570d2fa7c
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Proof of Transfer",
+ "pages": ["pox-details", "signer-details", "stacker-set"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/meta.json
similarity index 67%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/meta.json
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/meta.json
index 856c9a5e1..c903ea747 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/meta.json
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/meta.json
@@ -1,18 +1,14 @@
{
"title": "Smart Contracts",
"pages": [
- "status",
- "info",
- "source",
- "by-trait",
+ "constants",
+ "fast-read-only",
"interface",
"map-entry",
"read-only",
- "fast-read-only",
- "events",
- "variable",
- "constants",
- "traits"
+ "source",
+ "traits",
+ "variable"
],
"defaultOpen": false
}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/meta.json
similarity index 69%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/meta.json
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/meta.json
index 814398079..3e8e90d10 100644
--- a/content/docs/apis/stacks-blockchain-api/reference/sortitions/meta.json
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/meta.json
@@ -2,10 +2,10 @@
"title": "Sortitions",
"pages": [
"get-sortitions",
+ "latest-and-last-sortitions",
"sortition-by-burn-hash",
"sortition-by-burn-height",
- "sortition-by-consensus-hash",
- "latest-and-last-sortitions"
+ "sortition-by-consensus-hash"
],
"defaultOpen": false
}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/reference/transactions/meta.json b/content/docs/en/apis/stacks-node-rpc-api/reference/transactions/meta.json
new file mode 100644
index 000000000..2ce05a7e8
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/reference/transactions/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Transactions",
+ "pages": ["broadcast-transaction", "transaction-details-v3"],
+ "defaultOpen": false
+}
diff --git a/content/docs/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx b/content/docs/en/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx
similarity index 100%
rename from content/docs/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx
rename to content/docs/en/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx
diff --git a/content/docs/en/apis/stacks-node-rpc-api/usage.mdx b/content/docs/en/apis/stacks-node-rpc-api/usage.mdx
new file mode 100644
index 000000000..fc25408ea
--- /dev/null
+++ b/content/docs/en/apis/stacks-node-rpc-api/usage.mdx
@@ -0,0 +1,66 @@
+---
+title: Basic usage
+sidebarTitle: Usage
+description: Learn the basics of using the Stacks Node RPC API.
+---
+
+## Usage
+
+The Stacks Node RPC API provides direct access to Stacks blockchain nodes through RPC endpoints. All requests use HTTPS and enforce standard REST principles.
+
+### Base URL
+
+```console -c
+https://api.hiro.so
+```
+
+### Making requests
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' \
+ -H 'Accept: application/json'
+```
+
+### Authentication
+
+Include your API key for higher rate limits:
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Rate limits
+
+RPC calls are **weighted based on method cost** and consume more units than REST endpoints:
+
+| Method Type | Examples | Cost Multiplier |
+|-------------|----------|-----------------|
+| Light reads | `get_block`, `get_transaction` | 1× |
+| Read-only contract calls | `call_read_only_function` | 2× |
+| Transaction submission | `submit_transaction` | 3× |
+| Heavy operations | `trace_call`, deep contract scans | 5× |
+
+### Rate limit headers
+
+```
+X-RateLimit-Limit: 900 # window capacity in units
+X-RateLimit-Remaining: 125 # remaining units
+X-RateLimit-Reset: 60 # seconds until reset
+X-RateLimit-Method-Cost: 3 # cost for this RPC method
+X-Plan-Tier: starter # your plan tier
+X-Surface: rpc # indicates RPC endpoint
+```
+
+## Response codes
+
+| Code | Description |
+|------|-------------|
+| `200` | Successful request |
+| `400` | Invalid parameters |
+| `401` | Missing API key |
+| `403` | Invalid API key |
+| `404` | Resource not found |
+| `429` | Rate limit exceeded |
+| `5xx` | Server/upstream node errors |
diff --git a/content/docs/apis/token-metadata-api/index.mdx b/content/docs/en/apis/token-metadata-api/index.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/index.mdx
rename to content/docs/en/apis/token-metadata-api/index.mdx
diff --git a/content/docs/apis/token-metadata-api/meta.json b/content/docs/en/apis/token-metadata-api/meta.json
similarity index 100%
rename from content/docs/apis/token-metadata-api/meta.json
rename to content/docs/en/apis/token-metadata-api/meta.json
diff --git a/content/docs/apis/token-metadata-api/reference/info/index.mdx b/content/docs/en/apis/token-metadata-api/reference/info/index.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/info/index.mdx
rename to content/docs/en/apis/token-metadata-api/reference/info/index.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/info/meta.json b/content/docs/en/apis/token-metadata-api/reference/info/meta.json
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/info/meta.json
rename to content/docs/en/apis/token-metadata-api/reference/info/meta.json
diff --git a/content/docs/apis/token-metadata-api/reference/info/status.mdx b/content/docs/en/apis/token-metadata-api/reference/info/status.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/info/status.mdx
rename to content/docs/en/apis/token-metadata-api/reference/info/status.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx b/content/docs/en/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx
rename to content/docs/en/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx b/content/docs/en/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx
rename to content/docs/en/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/index.mdx b/content/docs/en/apis/token-metadata-api/reference/tokens/index.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/index.mdx
rename to content/docs/en/apis/token-metadata-api/reference/tokens/index.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/meta.json b/content/docs/en/apis/token-metadata-api/reference/tokens/meta.json
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/meta.json
rename to content/docs/en/apis/token-metadata-api/reference/tokens/meta.json
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx b/content/docs/en/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx
rename to content/docs/en/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx
diff --git a/content/docs/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx b/content/docs/en/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx
rename to content/docs/en/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx
diff --git a/content/docs/apis/token-metadata-api/usage.mdx b/content/docs/en/apis/token-metadata-api/usage.mdx
similarity index 100%
rename from content/docs/apis/token-metadata-api/usage.mdx
rename to content/docs/en/apis/token-metadata-api/usage.mdx
diff --git a/content/docs/meta.json b/content/docs/en/meta.json
similarity index 100%
rename from content/docs/meta.json
rename to content/docs/en/meta.json
diff --git a/content/docs/reference/stacks.js/(connect)/broadcast-transactions.mdx b/content/docs/en/reference/stacks.js/(connect)/broadcast-transactions.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(connect)/broadcast-transactions.mdx
rename to content/docs/en/reference/stacks.js/(connect)/broadcast-transactions.mdx
diff --git a/content/docs/reference/stacks.js/(connect)/connect-wallet.mdx b/content/docs/en/reference/stacks.js/(connect)/connect-wallet.mdx
similarity index 98%
rename from content/docs/reference/stacks.js/(connect)/connect-wallet.mdx
rename to content/docs/en/reference/stacks.js/(connect)/connect-wallet.mdx
index 1e819bf9a..b7e67650d 100644
--- a/content/docs/reference/stacks.js/(connect)/connect-wallet.mdx
+++ b/content/docs/en/reference/stacks.js/(connect)/connect-wallet.mdx
@@ -5,6 +5,8 @@ description: Learn how to connect to Stacks wallets and authenticate users.
Learn how to integrate wallet connections into your Stacks application. Connecting a wallet authenticates users and enables blockchain interactions like transfers and contract calls.
+## What you'll learn
+
:::objectives
- Install the `@stacks/connect` package
- Connect to a wallet and authenticate users
@@ -12,6 +14,8 @@ Learn how to integrate wallet connections into your Stacks application. Connecti
- Access user account data
:::
+## Prerequisites
+
:::prerequisites
- Node.js installed on your machine
- A web application setup (React, Vue, or vanilla JS)
@@ -125,6 +129,8 @@ Learn how to integrate wallet connections into your Stacks application. Connecti
+## Next steps
+
:::next-steps
- [Sign messages](/reference/stacks.js/message-signing): Prove address ownership
- [Broadcast transactions](/reference/stacks.js/broadcast-transactions): Learn about different transaction types
diff --git a/content/docs/reference/stacks.js/(connect)/message-signing.mdx b/content/docs/en/reference/stacks.js/(connect)/message-signing.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/(connect)/message-signing.mdx
rename to content/docs/en/reference/stacks.js/(connect)/message-signing.mdx
index 3b2de4b79..239831879 100644
--- a/content/docs/reference/stacks.js/(connect)/message-signing.mdx
+++ b/content/docs/en/reference/stacks.js/(connect)/message-signing.mdx
@@ -192,6 +192,8 @@ async function authenticate() {
}
```
+## Next steps
+
:::next-steps
- [Broadcast transactions](/reference/stacks.js/broadcast-transactions): Learn how to sign and broadcast transactions
- [Connect API reference](/reference/stacks.js/packages/connect): Explore all available methods
diff --git a/content/docs/reference/stacks.js/(connect)/meta.json b/content/docs/en/reference/stacks.js/(connect)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(connect)/meta.json
rename to content/docs/en/reference/stacks.js/(connect)/meta.json
diff --git a/content/docs/reference/stacks.js/(connect)/migration-guide.mdx b/content/docs/en/reference/stacks.js/(connect)/migration-guide.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(connect)/migration-guide.mdx
rename to content/docs/en/reference/stacks.js/(connect)/migration-guide.mdx
diff --git a/content/docs/reference/stacks.js/(connect)/wallet-support.mdx b/content/docs/en/reference/stacks.js/(connect)/wallet-support.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(connect)/wallet-support.mdx
rename to content/docs/en/reference/stacks.js/(connect)/wallet-support.mdx
diff --git a/content/docs/reference/stacks.js/(integrations)/meta.json b/content/docs/en/reference/stacks.js/(integrations)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(integrations)/meta.json
rename to content/docs/en/reference/stacks.js/(integrations)/meta.json
diff --git a/content/docs/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx b/content/docs/en/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
rename to content/docs/en/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
index 06e2d50a9..1c591dba6 100644
--- a/content/docs/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
+++ b/content/docs/en/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
@@ -9,6 +9,8 @@ import { File, Folder, Files } from 'fumadocs-ui/components/files';
import { Steps, Step } from '@/components/steps';
import { ArrowRight, Check } from 'lucide-react';
+## What you'll learn
+
:::objectives
- Install and configure the Pyth SDK
- Fetch VAA messages from Hermes API
@@ -16,6 +18,8 @@ import { ArrowRight, Check } from 'lucide-react';
- Handle post-conditions for oracle fees
:::
+## Prerequisites
+
:::prerequisites
- A React or Node.js application with Stacks.js installed
- Understanding of [Pyth oracle contracts](/resources/clarity/external-data)
@@ -190,6 +194,8 @@ import { ArrowRight, Check } from 'lucide-react';
+## Next steps
+
:::next-steps
- [Clarity contracts](/resources/clarity/external-data): Learn how to integrate Pyth oracle with Clarity contracts.
- [Testing with Clarinet](/tools/clarinet/pyth-oracle-integration): Learn how to test Pyth oracle integration with Clarinet.
diff --git a/content/docs/reference/stacks.js/(integrations)/react-native-integration.mdx b/content/docs/en/reference/stacks.js/(integrations)/react-native-integration.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/(integrations)/react-native-integration.mdx
rename to content/docs/en/reference/stacks.js/(integrations)/react-native-integration.mdx
index 471322080..59700fae5 100644
--- a/content/docs/reference/stacks.js/(integrations)/react-native-integration.mdx
+++ b/content/docs/en/reference/stacks.js/(integrations)/react-native-integration.mdx
@@ -279,6 +279,8 @@ const broadcastTransaction = async (transaction: StacksTransaction) => {
};
```
+## Next steps
+
:::next-steps
- [Transactions package](/reference/stacks.js/packages/transactions): Learn about the transactions package.
- [Network package](/reference/stacks.js/packages/network): Learn about the network package utils.
diff --git a/content/docs/reference/stacks.js/(local-accounts)/build-transactions.mdx b/content/docs/en/reference/stacks.js/(local-accounts)/build-transactions.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/(local-accounts)/build-transactions.mdx
rename to content/docs/en/reference/stacks.js/(local-accounts)/build-transactions.mdx
index 34e72bf04..509ca7eec 100644
--- a/content/docs/reference/stacks.js/(local-accounts)/build-transactions.mdx
+++ b/content/docs/en/reference/stacks.js/(local-accounts)/build-transactions.mdx
@@ -252,6 +252,8 @@ tx.setFee(feeRate);
const result = await broadcastTransaction({ transaction: tx });
```
+## Next steps
+
:::next-steps
- [Contract calls](/reference/stacks.js/contract-calls): Learn how to call contract functions.
- [Post-conditions](/reference/stacks.js/post-conditions): Understanding post-conditions.
diff --git a/content/docs/reference/stacks.js/(local-accounts)/contract-calls.mdx b/content/docs/en/reference/stacks.js/(local-accounts)/contract-calls.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(local-accounts)/contract-calls.mdx
rename to content/docs/en/reference/stacks.js/(local-accounts)/contract-calls.mdx
diff --git a/content/docs/reference/stacks.js/(local-accounts)/contract-deployment.mdx b/content/docs/en/reference/stacks.js/(local-accounts)/contract-deployment.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(local-accounts)/contract-deployment.mdx
rename to content/docs/en/reference/stacks.js/(local-accounts)/contract-deployment.mdx
diff --git a/content/docs/reference/stacks.js/(local-accounts)/meta.json b/content/docs/en/reference/stacks.js/(local-accounts)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(local-accounts)/meta.json
rename to content/docs/en/reference/stacks.js/(local-accounts)/meta.json
diff --git a/content/docs/reference/stacks.js/(local-accounts)/read-only-calls.mdx b/content/docs/en/reference/stacks.js/(local-accounts)/read-only-calls.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(local-accounts)/read-only-calls.mdx
rename to content/docs/en/reference/stacks.js/(local-accounts)/read-only-calls.mdx
diff --git a/content/docs/reference/stacks.js/(overview)/accounts-and-addresses.mdx b/content/docs/en/reference/stacks.js/(overview)/accounts-and-addresses.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(overview)/accounts-and-addresses.mdx
rename to content/docs/en/reference/stacks.js/(overview)/accounts-and-addresses.mdx
diff --git a/content/docs/reference/stacks.js/(overview)/meta.json b/content/docs/en/reference/stacks.js/(overview)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(overview)/meta.json
rename to content/docs/en/reference/stacks.js/(overview)/meta.json
diff --git a/content/docs/reference/stacks.js/(overview)/networks.mdx b/content/docs/en/reference/stacks.js/(overview)/networks.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(overview)/networks.mdx
rename to content/docs/en/reference/stacks.js/(overview)/networks.mdx
diff --git a/content/docs/reference/stacks.js/(overview)/private-keys.mdx b/content/docs/en/reference/stacks.js/(overview)/private-keys.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(overview)/private-keys.mdx
rename to content/docs/en/reference/stacks.js/(overview)/private-keys.mdx
diff --git a/content/docs/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx b/content/docs/en/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
rename to content/docs/en/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
index 17c3688c3..ad640a320 100644
--- a/content/docs/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
+++ b/content/docs/en/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
@@ -6,6 +6,8 @@ description: Learn how to add post-conditions to protect your Stacks transaction
Post-conditions are a powerful security feature in Stacks that protect users from unexpected transaction outcomes. This tutorial will walk you through implementing post-conditions in your applications to ensure transactions behave exactly as users expect.
+## What you'll learn
+
:::objectives
- Construct post-conditions using the Pc helper API
- Add post-conditions to different transaction types
@@ -14,6 +16,8 @@ Post-conditions are a powerful security feature in Stacks that protect users fro
- Handle semi-fungible tokens (SFTs) with post-conditions
:::
+## Prerequisites
+
:::prerequisites
- Basic understanding of Stacks transactions
- Stacks.js library installed (`npm install @stacks/transactions`)
@@ -231,6 +235,8 @@ type: tip
Explore the [Post-conditions template](https://platform.hiro.so) for interactive examples.
:::
+## Next steps
+
:::next-steps
- [Contract calling](/reference/stacks.js/contract-calls): Learn how to call contracts in Stacks
- [Transaction broadcasting](/reference/stacks.js/broadcast-transactions): Learn how to broadcast protected transactions
diff --git a/content/docs/reference/stacks.js/(post-conditions)/meta.json b/content/docs/en/reference/stacks.js/(post-conditions)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(post-conditions)/meta.json
rename to content/docs/en/reference/stacks.js/(post-conditions)/meta.json
diff --git a/content/docs/reference/stacks.js/(post-conditions)/post-conditions.mdx b/content/docs/en/reference/stacks.js/(post-conditions)/post-conditions.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(post-conditions)/post-conditions.mdx
rename to content/docs/en/reference/stacks.js/(post-conditions)/post-conditions.mdx
diff --git a/content/docs/reference/stacks.js/(utils)/address-validation.mdx b/content/docs/en/reference/stacks.js/(utils)/address-validation.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(utils)/address-validation.mdx
rename to content/docs/en/reference/stacks.js/(utils)/address-validation.mdx
diff --git a/content/docs/reference/stacks.js/(utils)/encoding-decoding.mdx b/content/docs/en/reference/stacks.js/(utils)/encoding-decoding.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(utils)/encoding-decoding.mdx
rename to content/docs/en/reference/stacks.js/(utils)/encoding-decoding.mdx
diff --git a/content/docs/reference/stacks.js/(utils)/meta.json b/content/docs/en/reference/stacks.js/(utils)/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/(utils)/meta.json
rename to content/docs/en/reference/stacks.js/(utils)/meta.json
diff --git a/content/docs/reference/stacks.js/(utils)/network-configuration.mdx b/content/docs/en/reference/stacks.js/(utils)/network-configuration.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(utils)/network-configuration.mdx
rename to content/docs/en/reference/stacks.js/(utils)/network-configuration.mdx
diff --git a/content/docs/reference/stacks.js/(utils)/unit-conversion.mdx b/content/docs/en/reference/stacks.js/(utils)/unit-conversion.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/(utils)/unit-conversion.mdx
rename to content/docs/en/reference/stacks.js/(utils)/unit-conversion.mdx
diff --git a/content/docs/reference/stacks.js/index.mdx b/content/docs/en/reference/stacks.js/index.mdx
similarity index 99%
rename from content/docs/reference/stacks.js/index.mdx
rename to content/docs/en/reference/stacks.js/index.mdx
index 691b5e171..1ca9db3e3 100644
--- a/content/docs/reference/stacks.js/index.mdx
+++ b/content/docs/en/reference/stacks.js/index.mdx
@@ -60,6 +60,8 @@ Stacks.js is separated into focused packages published under the `@stacks` scope
+## Next steps
+
:::next-steps
- [Connect wallet](/reference/stacks.js/connect-wallet): Add wallet authentication
- [Build transactions](/reference/stacks.js/build-transactions): Build and broadcast transactions
diff --git a/content/docs/reference/stacks.js/meta.json b/content/docs/en/reference/stacks.js/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/meta.json
rename to content/docs/en/reference/stacks.js/meta.json
diff --git a/content/docs/reference/stacks.js/packages/connect.mdx b/content/docs/en/reference/stacks.js/packages/connect.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/packages/connect.mdx
rename to content/docs/en/reference/stacks.js/packages/connect.mdx
diff --git a/content/docs/reference/stacks.js/packages/meta.json b/content/docs/en/reference/stacks.js/packages/meta.json
similarity index 100%
rename from content/docs/reference/stacks.js/packages/meta.json
rename to content/docs/en/reference/stacks.js/packages/meta.json
diff --git a/content/docs/reference/stacks.js/packages/network.mdx b/content/docs/en/reference/stacks.js/packages/network.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/packages/network.mdx
rename to content/docs/en/reference/stacks.js/packages/network.mdx
diff --git a/content/docs/reference/stacks.js/packages/sbtc.mdx b/content/docs/en/reference/stacks.js/packages/sbtc.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/packages/sbtc.mdx
rename to content/docs/en/reference/stacks.js/packages/sbtc.mdx
diff --git a/content/docs/reference/stacks.js/packages/transactions.mdx b/content/docs/en/reference/stacks.js/packages/transactions.mdx
similarity index 100%
rename from content/docs/reference/stacks.js/packages/transactions.mdx
rename to content/docs/en/reference/stacks.js/packages/transactions.mdx
diff --git a/content/docs/en/resources/archive/download-guide.mdx b/content/docs/en/resources/archive/download-guide.mdx
new file mode 100644
index 000000000..a78699448
--- /dev/null
+++ b/content/docs/en/resources/archive/download-guide.mdx
@@ -0,0 +1,182 @@
+---
+title: How to download Hiro archives
+description: Comprehensive guide for downloading large archive files reliably with troubleshooting tips.
+---
+
+## Overview
+
+Hiro Archive files are large datasets (ranging from several GB to several _hundred_ GB) hosted on Google Cloud Storage. Due to their size, downloads can be interrupted by network issues, rate limits, or connection timeouts. This guide provides multiple download methods and troubleshooting solutions.
+
+## File sizes and requirements
+
+Before downloading, ensure you have sufficient:
+- **Disk space**: Archives range from 10GB (APIs) to several hundred GB+ (blockchain data)
+- **Bandwidth**: Downloads can take hours or days depending on your connection
+- **Storage for extraction**: Archives expand significantly when extracted
+
+## Download methods
+
+### Method 1: wget with resume (Recommended for most users)
+
+The `wget` command with the `-c` flag enables resuming interrupted downloads:
+
+:::callout
+type: info
+### macOS Users
+You may need to install wget first: `brew install wget`. Alternatively, use the curl method below which is pre-installed on macOS.
+:::
+
+```terminal
+$ wget -c https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+$ wget -c --progress=bar:force:noscroll https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+```
+
+**Advantages:**
+- Resumes interrupted downloads automatically
+- Built into most Unix systems
+- Simple to use
+
+**Disadvantages:**
+- Single-threaded downloads
+- May still experience connection resets
+
+### Method 2: curl with retries
+
+Use `curl` with automatic retries for robust downloads. The `--continue-at -` flag resumes partial downloads, while `--output` specifies the filename:
+
+```terminal
+$ curl --continue-at - --retry 10 --retry-delay 5 --retry-max-time 0 \
+ --progress-bar \
+ --output mainnet-stacks-blockchain-latest.tar.gz \
+ https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+```
+
+**Advantages:**
+- Automatic retry mechanism
+- Resume capability with `-C -`
+- More configuration options
+
+### Method 3: gcloud storage cp (Fastest, requires authentication)
+
+Google Cloud CLI provides the fastest download speeds with parallel transfers. First authenticate with `gcloud auth login`, then either download the file to disk or stream directly to extraction:
+
+#### Download file to current directory
+
+```terminal
+$ gcloud storage cp gs://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz .
+```
+
+#### OR stream directly to extraction (saves disk space but slower due to sequential download)
+
+```terminal
+$ gcloud storage cp gs://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz - | tar -xz
+```
+
+**Advantages:**
+- Significantly faster downloads (2-3x speed improvement)
+- Built-in parallel transfers
+- Automatic retry handling
+- Can stream directly to extraction (useful when disk space is limited, but disables parallel transfers)
+
+**Disadvantages:**
+- Requires Google account authentication
+- Additional software installation needed
+
+### Method 4: Download managers (JDownloader)
+
+For users who prefer GUI applications or need advanced download management:
+
+1. Download and install [JDownloader](https://jdownloader.org/download/index)
+2. Copy the archive URL into JDownloader
+3. Configure parallel connections for faster downloads
+
+**Advantages:**
+- Graphical interface
+- Parallel downloading
+- Advanced retry mechanisms
+- Cross-platform support
+
+## Verification and extraction
+
+After downloading, verify the file integrity:
+
+:::callout
+type: info
+### Checksum Availability
+SHA256 checksum files are available for **all archives** to verify download integrity.
+:::
+
+1. **Download the checksum file:**
+ ```terminal
+ $ wget https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.sha256
+ ```
+
+2. **Verify the download:**
+ ```terminal
+ $ echo "$(cat mainnet-stacks-blockchain-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-latest.tar.gz" | shasum -a 256 -c
+ ```
+
+3. **Extract the archive:**
+ ```terminal
+ $ tar -zxvf mainnet-stacks-blockchain-latest.tar.gz -C /target/directory
+ ```
+
+:::callout
+type: info
+### Large file extraction
+The `marf.sqlite.blobs` file can be very large and may take significant time to extract. Ensure you have sufficient disk space and be patient during extraction.
+:::
+
+## Performance tips
+
+1. **Use gcloud for fastest downloads** - requires authentication but provides significant speed improvements
+2. **Download during off-peak hours** - typically late night or early morning
+3. **Use wired connections** - avoid Wi-Fi for large downloads when possible
+4. **Monitor disk space** - extracted archives can be 2-3x larger than compressed files
+5. **Consider streaming extraction** with gcloud to save disk space
+
+## FAQ
+
+
+
+ Why do downloads keep failing?
+
+ Large file downloads from cloud storage can be interrupted due to network issues, rate limiting, or connection timeouts. Use resume-capable tools like `wget -c` or `gcloud storage cp`.
+
+
+
+
+ Which download method should I use?
+
+ For fastest speeds, use `gcloud storage cp` (requires Google auth). For simplicity, use `wget -c`. For reliability without authentication, try a download manager like JDownloader.
+
+
+
+
+ How long should a download take?
+
+ Download time varies based on file size and connection speed. The mainnet blockchain archive (several hundred GB+) can take 6-24+ hours on typical broadband connections.
+
+
+
+
+ Can I resume a failed download?
+
+ Yes, use `wget -c`, `curl -C -`, or `gcloud storage cp` to resume interrupted downloads from where they stopped.
+
+
+
+
+ Why is gcloud faster?
+
+ Google Cloud CLI uses parallel transfers and optimized protocols when downloading from Google Cloud Storage, resulting in 2-3x speed improvements.
+
+
+
+
+ Do I need to verify downloaded files?
+
+ Yes, verify large downloads using SHA256 checksums to ensure data integrity.
+
+
+
diff --git a/content/docs/resources/archive/index.mdx b/content/docs/en/resources/archive/index.mdx
similarity index 57%
rename from content/docs/resources/archive/index.mdx
rename to content/docs/en/resources/archive/index.mdx
index 6ab5a589f..ad1ef11ee 100644
--- a/content/docs/resources/archive/index.mdx
+++ b/content/docs/en/resources/archive/index.mdx
@@ -11,11 +11,6 @@ The Hiro Archive enables you to quickly bootstrap supported services with pre-lo
[View the Hiro Archive](https://archive.hiro.so/)
-## Supported services
+## Installation
-We record and archive mainnet and testnet snapshots for the following services every night:
-
-:::next-steps
-- [Stacks blockchain](/resources/archive/stacks-blockchain): Bootstrap a Stacks node with archived blockchain data
-- [Verify archive data](/resources/archive/verify-archive-data): Verify the integrity of archive data
-:::
\ No newline at end of file
+See the [download](/resources/archive/download-guide) guide for instructions on how to download Hiro archives.
diff --git a/content/docs/en/resources/archive/meta.json b/content/docs/en/resources/archive/meta.json
new file mode 100644
index 000000000..e583e1c7d
--- /dev/null
+++ b/content/docs/en/resources/archive/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Hiro Archive",
+ "root": true,
+ "pages": ["index", "download-guide", "stacks-blockchain", "stacks-api", "token-metadata-api"]
+}
diff --git a/content/docs/resources/archive/stacks-api.mdx b/content/docs/en/resources/archive/stacks-api.mdx
similarity index 93%
rename from content/docs/resources/archive/stacks-api.mdx
rename to content/docs/en/resources/archive/stacks-api.mdx
index a43a77eed..ad145c49d 100644
--- a/content/docs/resources/archive/stacks-api.mdx
+++ b/content/docs/en/resources/archive/stacks-api.mdx
@@ -69,7 +69,7 @@ or the most recent upload for a particular version:
**If restoring via Postgres dump**
1. Download the archive and shasum for the appropriate network and restoration method.
-1. [Verify the archive](/resources/archive/verify-archive-data) with the shasum.
+1. Verify the archive using the steps in the [download guide](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):
```terminal
$ export PGPASSWORD=
@@ -83,7 +83,7 @@ or the most recent upload for a particular version:
**If restoring via TSV file**
1. Download the archive and shasum for the appropriate network and restoration method.
-1. [Verify the archive](/resources/archive/verify-archive-data) with the shasum.
+1. Verify the archive using the steps in the [download guide](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
1. Extract the archive into the desired directory:
```terminal
$ gzip -d --stdout > /path/to/extracted/file
diff --git a/content/docs/resources/archive/stacks-blockchain.mdx b/content/docs/en/resources/archive/stacks-blockchain.mdx
similarity index 73%
rename from content/docs/resources/archive/stacks-blockchain.mdx
rename to content/docs/en/resources/archive/stacks-blockchain.mdx
index aaeea9b10..be6358f1b 100644
--- a/content/docs/resources/archive/stacks-blockchain.mdx
+++ b/content/docs/en/resources/archive/stacks-blockchain.mdx
@@ -28,13 +28,20 @@ or the most recent upload for a particular version:
## Restoring a Stacks blockchain node using the Hiro Archive
1. Download the archive and shasum for the appropriate network.
-1. [Verify the archive](/resources/archive/verify-archive-data) with the shasum.
-1. Extract the archive into the desired directory:
+
+:::callout
+type: info
+### Download Help
+Archives are large files (321GB+ for mainnet) that may experience connection issues. For detailed download methods, troubleshooting, and faster download options, see the [How to download Hiro archives](/resources/archive/download-guide) guide.
+:::
+
+2. Verify the archive using the steps in the [download guide](/resources/archive/download-guide#verification-and-extraction).
+3. Extract the archive into the desired directory:
```terminal
$ tar -zxvf -C /target/directory
```
-1. [Configure the `working_dir` property](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) in your Stacks blockchain node Config.toml file to match the directory you extracted the archive to.
-1. Launch your Stacks blockchain node. You can use [one of these example configuration files](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) as a reference.
-1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:20443/v2/info) with [Hiro's](https://api.hiro.so/v2/info). If the block height matches or is close to Hiro's block height, the restoration was successful.
+4. [Configure the `working_dir` property](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) in your Stacks blockchain node Config.toml file to match the directory you extracted the archive to.
+5. Launch your Stacks blockchain node. You can use [one of these example configuration files](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) as a reference.
+6. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:20443/v2/info) with [Hiro's](https://api.hiro.so/v2/info). If the block height matches or is close to Hiro's block height, the restoration was successful.
1. It may take a few minutes for the local node to respond on this endpoint.
1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.
diff --git a/content/docs/resources/archive/token-metadata-api.mdx b/content/docs/en/resources/archive/token-metadata-api.mdx
similarity index 92%
rename from content/docs/resources/archive/token-metadata-api.mdx
rename to content/docs/en/resources/archive/token-metadata-api.mdx
index f7a07ab73..85c37ca9f 100644
--- a/content/docs/resources/archive/token-metadata-api.mdx
+++ b/content/docs/en/resources/archive/token-metadata-api.mdx
@@ -34,7 +34,7 @@ or the most recent upload for a particular version:
## Restoring the Token Metadata API using the Hiro Archive
1. Download the archive and shasum for the appropriate network.
-1. [Verify the archive](/resources/archive/verify-archive-data) with the shasum.
+1. Verify the archive using the steps in the [download guide](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):
```terminal
$ export PGPASSWORD=
diff --git a/content/docs/resources/clarity/(integrations)/external-data.mdx b/content/docs/en/resources/clarity/(integrations)/external-data.mdx
similarity index 99%
rename from content/docs/resources/clarity/(integrations)/external-data.mdx
rename to content/docs/en/resources/clarity/(integrations)/external-data.mdx
index 96a24b767..25b03b3e3 100644
--- a/content/docs/resources/clarity/(integrations)/external-data.mdx
+++ b/content/docs/en/resources/clarity/(integrations)/external-data.mdx
@@ -215,6 +215,8 @@ For testnet development, use these contract addresses:
(define-constant PYTH-STORAGE-CONTRACT-TESTNET 'ST20M5GABDT6WYJHXBT5CDH4501V1Q65242SPRMXH.pyth-storage-v3)
```
+## Next steps
+
:::next-steps
- [Frontend integration](/reference/stacks.js/pyth-oracle-integration): Learn how to fetch VAA messages and call your oracle-enabled contracts
- [Testing with Clarinet](/tools/clarinet/pyth-oracle-integration): Set up tests for contracts that depend on oracle data
diff --git a/content/docs/resources/clarity/(integrations)/meta.json b/content/docs/en/resources/clarity/(integrations)/meta.json
similarity index 100%
rename from content/docs/resources/clarity/(integrations)/meta.json
rename to content/docs/en/resources/clarity/(integrations)/meta.json
diff --git a/content/docs/resources/clarity/index.mdx b/content/docs/en/resources/clarity/index.mdx
similarity index 100%
rename from content/docs/resources/clarity/index.mdx
rename to content/docs/en/resources/clarity/index.mdx
diff --git a/content/docs/resources/clarity/meta.json b/content/docs/en/resources/clarity/meta.json
similarity index 100%
rename from content/docs/resources/clarity/meta.json
rename to content/docs/en/resources/clarity/meta.json
diff --git a/content/docs/resources/clarity/reference/functions.mdx b/content/docs/en/resources/clarity/reference/functions.mdx
similarity index 98%
rename from content/docs/resources/clarity/reference/functions.mdx
rename to content/docs/en/resources/clarity/reference/functions.mdx
index be18b46c0..f061401e6 100644
--- a/content/docs/resources/clarity/reference/functions.mdx
+++ b/content/docs/en/resources/clarity/reference/functions.mdx
@@ -50,7 +50,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `i1`, `i2`, ... | `int` or `uint` | Two or more integers to subtract |
+| i1, i2, ... | `int` or `uint` | Two or more integers to subtract |
```clarity
(- 10 3) ;; Returns 7
@@ -79,7 +79,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `i1`, `i2`, ... | `int` or `uint` | Two or more integers to multiply |
+| i1, i2, ... | `int` or `uint` | Two or more integers to multiply |
```clarity
(* 3 4) ;; Returns 12
@@ -105,7 +105,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `i1`, `i2`, ... | `int` or `uint` | Two or more integers to divide |
+| i1, i2, ... | `int` or `uint` | Two or more integers to divide |
```clarity
(/ 10 2) ;; Returns 5
@@ -347,7 +347,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `b1`, `b2`, ... | `bool` | Boolean values to evaluate |
+| b1, b2, ... | `bool` | Boolean values to evaluate |
```clarity
(and true true) ;; Returns true
@@ -356,7 +356,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
;; Multiple conditions
(define-read-only (is-valid-transfer (amount uint) (recipient principal))
- (and
+ (and
(> amount u0)
(not (is-eq recipient tx-sender))
(<= amount (get-balance tx-sender))))
@@ -376,7 +376,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `b1`, `b2`, ... | `bool` | Boolean values to evaluate |
+| b1, b2, ... | `bool` | Boolean values to evaluate |
```clarity
(or true false) ;; Returns true
@@ -385,7 +385,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
;; Check permissions
(define-read-only (can-access (user principal))
- (or
+ (or
(is-eq user contract-owner)
(default-to false (map-get? admins user))
(var-get public-access)))
@@ -457,7 +457,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `v1`, `v2`, ... | any | Values to compare for equality |
+| v1, v2, ... | any | Values to compare for equality |
```clarity
(is-eq 5 5) ;; Returns true
@@ -488,14 +488,14 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `v1`, `v2`, ... | any | Values to include in the list |
+| v1, v2, ... | any | Values to include in the list |
```clarity
(list 1 2 3) ;; Returns (1 2 3)
(list true false true) ;; Returns (true false true)
;; Create address list
-(define-data-var admins (list 5 principal)
+(define-data-var admins (list 5 principal)
(list 'SP1234... 'SP5678...))
```
@@ -921,7 +921,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
| `func` | function | Function to apply |
-| `list1`, `list2`, ... | `list` | Lists to map over |
+| list1, list2, ... | `list` | Lists to map over |
```clarity
(map + (list 1 2 3) (list 10 20 30)) ;; Returns (11 22 33)
@@ -1133,8 +1133,8 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
```clarity
(define-map balances principal uint)
-(define-map user-profiles
- principal
+(define-map user-profiles
+ principal
{
name: (string-ascii 50),
age: uint,
@@ -1142,8 +1142,8 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
})
;; Composite key
-(define-map allowances
- { owner: principal, spender: principal }
+(define-map allowances
+ { owner: principal, spender: principal }
uint)
```
@@ -1408,7 +1408,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
;; Success response
(define-public (deposit (amount uint))
(begin
- (map-set balances tx-sender
+ (map-set balances tx-sender
(+ (get-balance tx-sender) amount))
(ok amount)))
```
@@ -1812,7 +1812,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| Name | Type | Description |
|------|------|-------------|
-| `expr1`, `expr2`, ... | any | Expressions to execute |
+| expr1, expr2, ... | any | Expressions to execute |
| `last-expr` | any | Final expression (return value) |
```clarity
@@ -2181,7 +2181,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
(define-non-fungible-token complex-nft { id: uint, serial: (buff 20) })
;; NFT with metadata
-(define-map nft-metadata uint {
+(define-map nft-metadata uint {
name: (string-ascii 50),
uri: (string-ascii 200)
})
@@ -2354,7 +2354,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
;; Payment with reference
(define-public (pay-invoice (amount uint) (recipient principal) (invoice-id (buff 16)))
- (stx-transfer-memo? amount tx-sender recipient
+ (stx-transfer-memo? amount tx-sender recipient
(concat 0x494e56 invoice-id))) ;; "INV" prefix
```
@@ -2582,7 +2582,7 @@ Clarity provides a comprehensive set of built-in functions for smart contract de
| `public-key` | `(buff 33)` | Public key |
```clarity
-(secp256k1-verify
+(secp256k1-verify
0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
signature
public-key) ;; Returns bool
@@ -3328,4 +3328,3 @@ Key points:
(print { function: "transfer", amount: amount, sender: tx-sender })
(ok true)))
```
-
diff --git a/content/docs/resources/clarity/reference/keywords.mdx b/content/docs/en/resources/clarity/reference/keywords.mdx
similarity index 100%
rename from content/docs/resources/clarity/reference/keywords.mdx
rename to content/docs/en/resources/clarity/reference/keywords.mdx
diff --git a/content/docs/resources/clarity/reference/types.mdx b/content/docs/en/resources/clarity/reference/types.mdx
similarity index 100%
rename from content/docs/resources/clarity/reference/types.mdx
rename to content/docs/en/resources/clarity/reference/types.mdx
diff --git a/content/docs/resources/guides/api-keys.mdx b/content/docs/en/resources/guides/api-keys.mdx
similarity index 100%
rename from content/docs/resources/guides/api-keys.mdx
rename to content/docs/en/resources/guides/api-keys.mdx
diff --git a/content/docs/resources/guides/build-a-decentralized-kickstarter.mdx b/content/docs/en/resources/guides/build-a-decentralized-kickstarter.mdx
similarity index 100%
rename from content/docs/resources/guides/build-a-decentralized-kickstarter.mdx
rename to content/docs/en/resources/guides/build-a-decentralized-kickstarter.mdx
diff --git a/content/docs/resources/guides/build-an-nft-marketplace.mdx b/content/docs/en/resources/guides/build-an-nft-marketplace.mdx
similarity index 100%
rename from content/docs/resources/guides/build-an-nft-marketplace.mdx
rename to content/docs/en/resources/guides/build-an-nft-marketplace.mdx
diff --git a/content/docs/resources/guides/index.mdx b/content/docs/en/resources/guides/index.mdx
similarity index 100%
rename from content/docs/resources/guides/index.mdx
rename to content/docs/en/resources/guides/index.mdx
diff --git a/content/docs/resources/guides/installing-docker.mdx b/content/docs/en/resources/guides/installing-docker.mdx
similarity index 99%
rename from content/docs/resources/guides/installing-docker.mdx
rename to content/docs/en/resources/guides/installing-docker.mdx
index 12abd5478..b3db8d319 100644
--- a/content/docs/resources/guides/installing-docker.mdx
+++ b/content/docs/en/resources/guides/installing-docker.mdx
@@ -39,6 +39,8 @@ You might need to install additional Windows components like Hyper-V or WSL 2.
---
+## Next steps
+
:::next-steps
- [Sync a Bitcoin node](/resources/guides/sync-a-bitcoin-node): Learn how to sync a Bitcoin node for running Chainhook as a service.
- [Sync a Stacks node](/resources/guides/sync-a-stacks-node): Learn how to sync a Stacks node for running a local devnet.
diff --git a/content/docs/resources/guides/meta.json b/content/docs/en/resources/guides/meta.json
similarity index 100%
rename from content/docs/resources/guides/meta.json
rename to content/docs/en/resources/guides/meta.json
diff --git a/content/docs/resources/guides/no-loss-lottery.mdx b/content/docs/en/resources/guides/no-loss-lottery.mdx
similarity index 100%
rename from content/docs/resources/guides/no-loss-lottery.mdx
rename to content/docs/en/resources/guides/no-loss-lottery.mdx
diff --git a/content/docs/resources/guides/rate-limits.mdx b/content/docs/en/resources/guides/rate-limits.mdx
similarity index 100%
rename from content/docs/resources/guides/rate-limits.mdx
rename to content/docs/en/resources/guides/rate-limits.mdx
diff --git a/content/docs/resources/guides/response-headers.mdx b/content/docs/en/resources/guides/response-headers.mdx
similarity index 100%
rename from content/docs/resources/guides/response-headers.mdx
rename to content/docs/en/resources/guides/response-headers.mdx
diff --git a/content/docs/resources/guides/sync-a-bitcoin-node.mdx b/content/docs/en/resources/guides/sync-a-bitcoin-node.mdx
similarity index 100%
rename from content/docs/resources/guides/sync-a-bitcoin-node.mdx
rename to content/docs/en/resources/guides/sync-a-bitcoin-node.mdx
diff --git a/content/docs/resources/guides/sync-a-stacks-node.mdx b/content/docs/en/resources/guides/sync-a-stacks-node.mdx
similarity index 98%
rename from content/docs/resources/guides/sync-a-stacks-node.mdx
rename to content/docs/en/resources/guides/sync-a-stacks-node.mdx
index 72df3935d..e9901e890 100644
--- a/content/docs/resources/guides/sync-a-stacks-node.mdx
+++ b/content/docs/en/resources/guides/sync-a-stacks-node.mdx
@@ -5,6 +5,8 @@ description: Learn how to sync a Stacks node for running a local devnet or mainn
Running a Stacks node is crucial for developers aiming to interact directly with the Stacks blockchain. It allows for the verification of transactions, ensures decentralized operations, and enhances blockchain security.
+## What you'll learn
+
:::objectives
- Clone the Stacks blockchain Docker repository
- Start the service
diff --git a/content/docs/resources/guides/using-clarity-values.mdx b/content/docs/en/resources/guides/using-clarity-values.mdx
similarity index 100%
rename from content/docs/resources/guides/using-clarity-values.mdx
rename to content/docs/en/resources/guides/using-clarity-values.mdx
diff --git a/content/docs/resources/guides/using-pyth-price-feeds.mdx b/content/docs/en/resources/guides/using-pyth-price-feeds.mdx
similarity index 99%
rename from content/docs/resources/guides/using-pyth-price-feeds.mdx
rename to content/docs/en/resources/guides/using-pyth-price-feeds.mdx
index 26f02e0c0..daf69fe68 100644
--- a/content/docs/resources/guides/using-pyth-price-feeds.mdx
+++ b/content/docs/en/resources/guides/using-pyth-price-feeds.mdx
@@ -410,6 +410,8 @@ Batch multiple price updates when possible:
- [Trust Machines Pyth integration](https://github.com/Trust-Machines/stacks-pyth-bridge)
- [Wormhole VAA specification](https://wormhole.com/docs/protocol/infrastructure/vaas/)
+## Next steps
+
:::next-steps
- [Deep dive on Clarity](/resources/clarity/external-data): Advanced oracle patterns and optimizations
- [Deep dive on frontend](/reference/stacks.js/pyth-oracle-integration): Building production-ready oracle UIs
diff --git a/content/docs/resources/snippets/build-a-stx-pc.mdx b/content/docs/en/resources/snippets/build-a-stx-pc.mdx
similarity index 100%
rename from content/docs/resources/snippets/build-a-stx-pc.mdx
rename to content/docs/en/resources/snippets/build-a-stx-pc.mdx
diff --git a/content/docs/resources/snippets/build-an-ft-pc.mdx b/content/docs/en/resources/snippets/build-an-ft-pc.mdx
similarity index 100%
rename from content/docs/resources/snippets/build-an-ft-pc.mdx
rename to content/docs/en/resources/snippets/build-an-ft-pc.mdx
diff --git a/content/docs/resources/snippets/build-an-nft-pc.mdx b/content/docs/en/resources/snippets/build-an-nft-pc.mdx
similarity index 100%
rename from content/docs/resources/snippets/build-an-nft-pc.mdx
rename to content/docs/en/resources/snippets/build-an-nft-pc.mdx
diff --git a/content/docs/resources/snippets/build-an-unsigned-tx.mdx b/content/docs/en/resources/snippets/build-an-unsigned-tx.mdx
similarity index 100%
rename from content/docs/resources/snippets/build-an-unsigned-tx.mdx
rename to content/docs/en/resources/snippets/build-an-unsigned-tx.mdx
diff --git a/content/docs/resources/snippets/check-for-duplicates.mdx b/content/docs/en/resources/snippets/check-for-duplicates.mdx
similarity index 100%
rename from content/docs/resources/snippets/check-for-duplicates.mdx
rename to content/docs/en/resources/snippets/check-for-duplicates.mdx
diff --git a/content/docs/resources/snippets/convert-btc-to-stx-address.mdx b/content/docs/en/resources/snippets/convert-btc-to-stx-address.mdx
similarity index 100%
rename from content/docs/resources/snippets/convert-btc-to-stx-address.mdx
rename to content/docs/en/resources/snippets/convert-btc-to-stx-address.mdx
diff --git a/content/docs/resources/snippets/convert-string-to-principal.mdx b/content/docs/en/resources/snippets/convert-string-to-principal.mdx
similarity index 100%
rename from content/docs/resources/snippets/convert-string-to-principal.mdx
rename to content/docs/en/resources/snippets/convert-string-to-principal.mdx
diff --git a/content/docs/resources/snippets/create-a-random-burn-address.mdx b/content/docs/en/resources/snippets/create-a-random-burn-address.mdx
similarity index 100%
rename from content/docs/resources/snippets/create-a-random-burn-address.mdx
rename to content/docs/en/resources/snippets/create-a-random-burn-address.mdx
diff --git a/content/docs/resources/snippets/create-a-sponsored-tx.mdx b/content/docs/en/resources/snippets/create-a-sponsored-tx.mdx
similarity index 100%
rename from content/docs/resources/snippets/create-a-sponsored-tx.mdx
rename to content/docs/en/resources/snippets/create-a-sponsored-tx.mdx
diff --git a/content/docs/resources/snippets/create-sha256-hash-clarity.mdx b/content/docs/en/resources/snippets/create-sha256-hash-clarity.mdx
similarity index 100%
rename from content/docs/resources/snippets/create-sha256-hash-clarity.mdx
rename to content/docs/en/resources/snippets/create-sha256-hash-clarity.mdx
diff --git a/content/docs/resources/snippets/create-sha256-hash-stacks-js.mdx b/content/docs/en/resources/snippets/create-sha256-hash-stacks-js.mdx
similarity index 100%
rename from content/docs/resources/snippets/create-sha256-hash-stacks-js.mdx
rename to content/docs/en/resources/snippets/create-sha256-hash-stacks-js.mdx
diff --git a/content/docs/resources/snippets/deploy-a-contract.mdx b/content/docs/en/resources/snippets/deploy-a-contract.mdx
similarity index 100%
rename from content/docs/resources/snippets/deploy-a-contract.mdx
rename to content/docs/en/resources/snippets/deploy-a-contract.mdx
diff --git a/content/docs/resources/snippets/derive-principal-addresses-between-networks.mdx b/content/docs/en/resources/snippets/derive-principal-addresses-between-networks.mdx
similarity index 100%
rename from content/docs/resources/snippets/derive-principal-addresses-between-networks.mdx
rename to content/docs/en/resources/snippets/derive-principal-addresses-between-networks.mdx
diff --git a/content/docs/resources/snippets/derive-stacks-address-from-keys.mdx b/content/docs/en/resources/snippets/derive-stacks-address-from-keys.mdx
similarity index 100%
rename from content/docs/resources/snippets/derive-stacks-address-from-keys.mdx
rename to content/docs/en/resources/snippets/derive-stacks-address-from-keys.mdx
diff --git a/content/docs/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx b/content/docs/en/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx
similarity index 100%
rename from content/docs/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx
rename to content/docs/en/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx
diff --git a/content/docs/resources/snippets/filter-items-from-a-list.mdx b/content/docs/en/resources/snippets/filter-items-from-a-list.mdx
similarity index 100%
rename from content/docs/resources/snippets/filter-items-from-a-list.mdx
rename to content/docs/en/resources/snippets/filter-items-from-a-list.mdx
diff --git a/content/docs/resources/snippets/generate-a-secret-key.mdx b/content/docs/en/resources/snippets/generate-a-secret-key.mdx
similarity index 100%
rename from content/docs/resources/snippets/generate-a-secret-key.mdx
rename to content/docs/en/resources/snippets/generate-a-secret-key.mdx
diff --git a/content/docs/resources/snippets/generate-a-wallet.mdx b/content/docs/en/resources/snippets/generate-a-wallet.mdx
similarity index 100%
rename from content/docs/resources/snippets/generate-a-wallet.mdx
rename to content/docs/en/resources/snippets/generate-a-wallet.mdx
diff --git a/content/docs/resources/snippets/generate-random-number.mdx b/content/docs/en/resources/snippets/generate-random-number.mdx
similarity index 100%
rename from content/docs/resources/snippets/generate-random-number.mdx
rename to content/docs/en/resources/snippets/generate-random-number.mdx
diff --git a/content/docs/resources/snippets/get-account-details-from-wallet.mdx b/content/docs/en/resources/snippets/get-account-details-from-wallet.mdx
similarity index 100%
rename from content/docs/resources/snippets/get-account-details-from-wallet.mdx
rename to content/docs/en/resources/snippets/get-account-details-from-wallet.mdx
diff --git a/content/docs/resources/snippets/helper-function-to-restrict-contract-calls.mdx b/content/docs/en/resources/snippets/helper-function-to-restrict-contract-calls.mdx
similarity index 100%
rename from content/docs/resources/snippets/helper-function-to-restrict-contract-calls.mdx
rename to content/docs/en/resources/snippets/helper-function-to-restrict-contract-calls.mdx
diff --git a/content/docs/resources/snippets/index.mdx b/content/docs/en/resources/snippets/index.mdx
similarity index 100%
rename from content/docs/resources/snippets/index.mdx
rename to content/docs/en/resources/snippets/index.mdx
diff --git a/content/docs/resources/snippets/integrate-api-keys-using-stacksjs.mdx b/content/docs/en/resources/snippets/integrate-api-keys-using-stacksjs.mdx
similarity index 100%
rename from content/docs/resources/snippets/integrate-api-keys-using-stacksjs.mdx
rename to content/docs/en/resources/snippets/integrate-api-keys-using-stacksjs.mdx
diff --git a/content/docs/resources/snippets/meta.json b/content/docs/en/resources/snippets/meta.json
similarity index 100%
rename from content/docs/resources/snippets/meta.json
rename to content/docs/en/resources/snippets/meta.json
diff --git a/content/docs/resources/snippets/return-an-entry-from-a-map.mdx b/content/docs/en/resources/snippets/return-an-entry-from-a-map.mdx
similarity index 100%
rename from content/docs/resources/snippets/return-an-entry-from-a-map.mdx
rename to content/docs/en/resources/snippets/return-an-entry-from-a-map.mdx
diff --git a/content/docs/resources/snippets/transfer-a-sip10-token.mdx b/content/docs/en/resources/snippets/transfer-a-sip10-token.mdx
similarity index 100%
rename from content/docs/resources/snippets/transfer-a-sip10-token.mdx
rename to content/docs/en/resources/snippets/transfer-a-sip10-token.mdx
diff --git a/content/docs/resources/snippets/transfer-stx.mdx b/content/docs/en/resources/snippets/transfer-stx.mdx
similarity index 100%
rename from content/docs/resources/snippets/transfer-stx.mdx
rename to content/docs/en/resources/snippets/transfer-stx.mdx
diff --git a/content/docs/resources/templates/index.mdx b/content/docs/en/resources/templates/index.mdx
similarity index 100%
rename from content/docs/resources/templates/index.mdx
rename to content/docs/en/resources/templates/index.mdx
diff --git a/content/docs/resources/templates/meta.json b/content/docs/en/resources/templates/meta.json
similarity index 100%
rename from content/docs/resources/templates/meta.json
rename to content/docs/en/resources/templates/meta.json
diff --git a/content/docs/start/index.mdx b/content/docs/en/start/index.mdx
similarity index 100%
rename from content/docs/start/index.mdx
rename to content/docs/en/start/index.mdx
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx b/content/docs/en/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
index 49eb8f40f..9a496d127 100644
--- a/content/docs/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
@@ -158,6 +158,8 @@ Use a download manager with resume support:
$ aria2c -x 16 -s 16 https://archive.hiro.so/bitcoin-indexer/mainnet/bitcoin-indexer-full-latest.tar.gz
```
+## Next steps
+
:::next-steps
- [Configure the indexer](/tools/bitcoin-indexer/configuration): Fine-tune settings for your use case
- [Start using the Ordinals API](/tools/bitcoin-indexer/ordinals-api): Run queries on your indexed data
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/configuration.mdx b/content/docs/en/tools/bitcoin-indexer/(indexer)/configuration.mdx
similarity index 100%
rename from content/docs/tools/bitcoin-indexer/(indexer)/configuration.mdx
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/configuration.mdx
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/full-sync.mdx b/content/docs/en/tools/bitcoin-indexer/(indexer)/full-sync.mdx
similarity index 98%
rename from content/docs/tools/bitcoin-indexer/(indexer)/full-sync.mdx
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/full-sync.mdx
index 960daec60..3d2afdeda 100644
--- a/content/docs/tools/bitcoin-indexer/(indexer)/full-sync.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(indexer)/full-sync.mdx
@@ -7,11 +7,13 @@ isNew: true
import { ArrowRight, Check } from 'lucide-react';
-::objectives
+## What you'll learn
+
+:::objectives
- Set up and configure the Bitcoin Indexer
- Run the indexer from scratch
- Monitor indexing progress effectively
-::
+:::
:::prerequisites
- Bitcoin Core node running with `txindex=1`
@@ -178,6 +180,8 @@ Test that APIs are returning data:
$ curl http://localhost:3000/ordinals/v1/inscriptions/0
```
+## Next steps
+
:::next-steps
- [Hiro Archives](/tools/bitcoin-indexer/archive-bootstrap): Skip weeks of indexing by bootstrapping from Hiro's pre-indexed archives.
- [Advanced configuration](/tools/bitcoin-indexer/configuration): Configure the Bitcoin Indexer for optimal performance and customize metaprotocol settings.
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/installation.mdx b/content/docs/en/tools/bitcoin-indexer/(indexer)/installation.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/(indexer)/installation.mdx
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/installation.mdx
index 530b215ab..96ea1ca22 100644
--- a/content/docs/tools/bitcoin-indexer/(indexer)/installation.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(indexer)/installation.mdx
@@ -212,6 +212,8 @@ $ bitcoin-indexer --help
Bitcoin Indexer - High-performance metaprotocol indexing engine
```
+## Next steps
+
:::next-steps
- [Configure the indexer](/tools/bitcoin-indexer/configuration): Set up bitcoin-indexer-config.toml
- [Bootstrap from archives](/tools/bitcoin-indexer/archive-bootstrap): Speed up initial sync with pre-indexed data
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/meta.json b/content/docs/en/tools/bitcoin-indexer/(indexer)/meta.json
similarity index 100%
rename from content/docs/tools/bitcoin-indexer/(indexer)/meta.json
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/meta.json
diff --git a/content/docs/tools/bitcoin-indexer/(indexer)/node-installation.mdx b/content/docs/en/tools/bitcoin-indexer/(indexer)/node-installation.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/(indexer)/node-installation.mdx
rename to content/docs/en/tools/bitcoin-indexer/(indexer)/node-installation.mdx
index 0e45f42d3..fb0d56828 100644
--- a/content/docs/tools/bitcoin-indexer/(indexer)/node-installation.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(indexer)/node-installation.mdx
@@ -206,6 +206,8 @@ $ sudo systemctl status bitcoind
Active: [32mactive (running)[0m
```
+## Next steps
+
:::next-steps
- [Configure the indexer](/tools/bitcoin-indexer/configuration): Set up the Bitcoin Indexer to connect to your node
- [Bootstrap from archive](/tools/bitcoin-indexer/archive-bootstrap): Skip the wait with pre-synced archives
diff --git a/content/docs/tools/bitcoin-indexer/(integrations)/meta.json b/content/docs/en/tools/bitcoin-indexer/(integrations)/meta.json
similarity index 100%
rename from content/docs/tools/bitcoin-indexer/(integrations)/meta.json
rename to content/docs/en/tools/bitcoin-indexer/(integrations)/meta.json
diff --git a/content/docs/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx b/content/docs/en/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
rename to content/docs/en/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
index 409384a04..10e870566 100644
--- a/content/docs/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
@@ -226,6 +226,8 @@ All errors return consistent JSON structure:
| `RATE_LIMITED` | 429 | Too many requests |
| `INTERNAL_ERROR` | 500 | Server error |
+## Next steps
+
:::next-steps
- [Runes API](/tools/bitcoin-indexer/runes-api): Query Runes tokens and balances
- [Ordinals API](/tools/bitcoin-indexer/ordinals-api): Access Ordinals data
diff --git a/content/docs/tools/bitcoin-indexer/(integrations)/runes-api.mdx b/content/docs/en/tools/bitcoin-indexer/(integrations)/runes-api.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/(integrations)/runes-api.mdx
rename to content/docs/en/tools/bitcoin-indexer/(integrations)/runes-api.mdx
index 3c533fc47..bd6015d0c 100644
--- a/content/docs/tools/bitcoin-indexer/(integrations)/runes-api.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/(integrations)/runes-api.mdx
@@ -226,6 +226,8 @@ All errors return consistent JSON structure:
| `RATE_LIMITED` | 429 | Too many requests |
| `INTERNAL_ERROR` | 500 | Server error |
+## Next steps
+
:::next-steps
- [Runes API](/tools/bitcoin-indexer/runes-api): Query Runes tokens and balances
- [Ordinals API](/tools/bitcoin-indexer/ordinals-api): Access Ordinals data
diff --git a/content/docs/tools/bitcoin-indexer/(overview)/meta.json b/content/docs/en/tools/bitcoin-indexer/(overview)/meta.json
similarity index 100%
rename from content/docs/tools/bitcoin-indexer/(overview)/meta.json
rename to content/docs/en/tools/bitcoin-indexer/(overview)/meta.json
diff --git a/content/docs/tools/bitcoin-indexer/index.mdx b/content/docs/en/tools/bitcoin-indexer/index.mdx
similarity index 99%
rename from content/docs/tools/bitcoin-indexer/index.mdx
rename to content/docs/en/tools/bitcoin-indexer/index.mdx
index ae15f6f4e..3ff71f2dc 100644
--- a/content/docs/tools/bitcoin-indexer/index.mdx
+++ b/content/docs/en/tools/bitcoin-indexer/index.mdx
@@ -29,6 +29,8 @@ Docker images are also available:
$ docker pull hirosystems/bitcoin-indexer:latest
```
+## Next steps
+
:::next-steps
- [Node installation](/tools/bitcoin-indexer/node-installation): Configure and sync a Bitcoin Core node optimized for the Bitcoin Indexer.
- [Full sync](/tools/bitcoin-indexer/full-sync): Run the indexer from scratch
diff --git a/content/docs/tools/bitcoin-indexer/meta.json b/content/docs/en/tools/bitcoin-indexer/meta.json
similarity index 100%
rename from content/docs/tools/bitcoin-indexer/meta.json
rename to content/docs/en/tools/bitcoin-indexer/meta.json
diff --git a/content/docs/tools/chainhook/(chainhook-cli)/cli-reference.mdx b/content/docs/en/tools/chainhook/(chainhook-cli)/cli-reference.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(chainhook-cli)/cli-reference.mdx
rename to content/docs/en/tools/chainhook/(chainhook-cli)/cli-reference.mdx
diff --git a/content/docs/tools/chainhook/(chainhook-cli)/event-scanning.mdx b/content/docs/en/tools/chainhook/(chainhook-cli)/event-scanning.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(chainhook-cli)/event-scanning.mdx
rename to content/docs/en/tools/chainhook/(chainhook-cli)/event-scanning.mdx
diff --git a/content/docs/tools/chainhook/(chainhook-cli)/meta.json b/content/docs/en/tools/chainhook/(chainhook-cli)/meta.json
similarity index 100%
rename from content/docs/tools/chainhook/(chainhook-cli)/meta.json
rename to content/docs/en/tools/chainhook/(chainhook-cli)/meta.json
diff --git a/content/docs/tools/chainhook/(chainhook-cli)/service-mode.mdx b/content/docs/en/tools/chainhook/(chainhook-cli)/service-mode.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(chainhook-cli)/service-mode.mdx
rename to content/docs/en/tools/chainhook/(chainhook-cli)/service-mode.mdx
diff --git a/content/docs/tools/chainhook/(event-handling)/custom-indexer.mdx b/content/docs/en/tools/chainhook/(event-handling)/custom-indexer.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(event-handling)/custom-indexer.mdx
rename to content/docs/en/tools/chainhook/(event-handling)/custom-indexer.mdx
diff --git a/content/docs/tools/chainhook/(event-handling)/example-indexers.mdx b/content/docs/en/tools/chainhook/(event-handling)/example-indexers.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(event-handling)/example-indexers.mdx
rename to content/docs/en/tools/chainhook/(event-handling)/example-indexers.mdx
diff --git a/content/docs/tools/chainhook/(event-handling)/meta.json b/content/docs/en/tools/chainhook/(event-handling)/meta.json
similarity index 100%
rename from content/docs/tools/chainhook/(event-handling)/meta.json
rename to content/docs/en/tools/chainhook/(event-handling)/meta.json
diff --git a/content/docs/tools/chainhook/(event-handling)/payload-handling.mdx b/content/docs/en/tools/chainhook/(event-handling)/payload-handling.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(event-handling)/payload-handling.mdx
rename to content/docs/en/tools/chainhook/(event-handling)/payload-handling.mdx
diff --git a/content/docs/tools/chainhook/(event-handling)/webhook-setup.mdx b/content/docs/en/tools/chainhook/(event-handling)/webhook-setup.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(event-handling)/webhook-setup.mdx
rename to content/docs/en/tools/chainhook/(event-handling)/webhook-setup.mdx
diff --git a/content/docs/tools/chainhook/(integrations)/meta.json b/content/docs/en/tools/chainhook/(integrations)/meta.json
similarity index 100%
rename from content/docs/tools/chainhook/(integrations)/meta.json
rename to content/docs/en/tools/chainhook/(integrations)/meta.json
diff --git a/content/docs/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx b/content/docs/en/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
similarity index 98%
rename from content/docs/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
rename to content/docs/en/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
index f885b4046..aa20fdb7b 100644
--- a/content/docs/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
+++ b/content/docs/en/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
@@ -3,12 +3,16 @@ title: Register Chainhooks on devnet
description: In this guide, you'll learn how to automatically register Chainhooks on devnet using Clarinet.
---
+## What you'll learn
+
:::objectives
- Create Chainhook predicate files in your Clarinet project
- Register predicates automatically when starting devnet
- Monitor Chainhook execution during local development
:::
+## Prerequisites
+
:::prerequisites
- Clarinet version 2.1.0 or higher installed
- A Clarinet project with smart contracts
@@ -111,6 +115,8 @@ description: In this guide, you'll learn how to automatically register Chainhook
+## Next steps
+
:::next-steps
- [Bitcoin scopes](/tools/chainhook/reference/bitcoin-scopes): Explore available event types for Bitcoin
- [Stacks scopes](/tools/chainhook/reference/stacks-scopes): Explore available event types for Stacks
diff --git a/content/docs/tools/chainhook/(overview)/meta.json b/content/docs/en/tools/chainhook/(overview)/meta.json
similarity index 100%
rename from content/docs/tools/chainhook/(overview)/meta.json
rename to content/docs/en/tools/chainhook/(overview)/meta.json
diff --git a/content/docs/tools/chainhook/(overview)/quickstart.mdx b/content/docs/en/tools/chainhook/(overview)/quickstart.mdx
similarity index 97%
rename from content/docs/tools/chainhook/(overview)/quickstart.mdx
rename to content/docs/en/tools/chainhook/(overview)/quickstart.mdx
index 9e4733253..22002b9d8 100644
--- a/content/docs/tools/chainhook/(overview)/quickstart.mdx
+++ b/content/docs/en/tools/chainhook/(overview)/quickstart.mdx
@@ -3,11 +3,15 @@ title: Quickstart
description: In this guide, you'll create your first Chainhook predicate to monitor STX transfers on the Stacks blockchain.
---
+## What you'll learn
+
:::objectives
- How to create a Chainhook predicate for tracking STX transfers
- How to scan historical blockchain data using Chainhook
:::
+## Prerequisites
+
:::prerequisites
- For installation instructions, visit the [Chainhook installation guide](/tools/chainhook#installation).
:::
@@ -88,6 +92,8 @@ description: In this guide, you'll create your first Chainhook predicate to moni
+## Next steps
+
:::next-steps
- [Design custom predicates](/tools/chainhook/usage): Learn to create predicates for contract calls, NFT transfers, and more
- [Run Chainhook as a service](/tools/chainhook/service-mode): Set up continuous blockchain monitoring with webhook delivery
diff --git a/content/docs/tools/chainhook/(overview)/usage.mdx b/content/docs/en/tools/chainhook/(overview)/usage.mdx
similarity index 100%
rename from content/docs/tools/chainhook/(overview)/usage.mdx
rename to content/docs/en/tools/chainhook/(overview)/usage.mdx
diff --git a/content/docs/tools/chainhook/index.mdx b/content/docs/en/tools/chainhook/index.mdx
similarity index 99%
rename from content/docs/tools/chainhook/index.mdx
rename to content/docs/en/tools/chainhook/index.mdx
index f1de1ba83..186eb4185 100644
--- a/content/docs/tools/chainhook/index.mdx
+++ b/content/docs/en/tools/chainhook/index.mdx
@@ -43,6 +43,8 @@ $ cd chainhook && cargo chainhook-install
+## Next steps
+
:::next-steps
- [Quickstart](/tools/chainhook/quickstart): Get started with Chainhook.
- [Register chainhooks locally](/tools/chainhook/register-chainhooks-on-devnet): Register chainhooks on your local blockchain.
diff --git a/content/docs/tools/chainhook/meta.json b/content/docs/en/tools/chainhook/meta.json
similarity index 100%
rename from content/docs/tools/chainhook/meta.json
rename to content/docs/en/tools/chainhook/meta.json
diff --git a/content/docs/tools/chainhook/reference/bitcoin-scopes.mdx b/content/docs/en/tools/chainhook/reference/bitcoin-scopes.mdx
similarity index 100%
rename from content/docs/tools/chainhook/reference/bitcoin-scopes.mdx
rename to content/docs/en/tools/chainhook/reference/bitcoin-scopes.mdx
diff --git a/content/docs/tools/chainhook/reference/stacks-scopes.mdx b/content/docs/en/tools/chainhook/reference/stacks-scopes.mdx
similarity index 100%
rename from content/docs/tools/chainhook/reference/stacks-scopes.mdx
rename to content/docs/en/tools/chainhook/reference/stacks-scopes.mdx
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/cli-reference.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/cli-reference.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-cli)/cli-reference.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/cli-reference.mdx
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/contract-interaction.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
index 543ae7b4b..3fa7ae1c5 100644
--- a/content/docs/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
@@ -178,6 +178,8 @@ For a complete list of available console commands and their usage, view the [CLI
+## Next steps
+
:::next-steps
- [Validation and analysis](/tools/clarinet/validation-and-analysis): Learn how to test and validate your Clarinet project.
- [Deployment](/tools/clarinet/deployment): Learn how to deploy your Clarinet project.
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/deployment.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/deployment.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-cli)/deployment.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/deployment.mdx
index 3f6590a13..900e653cd 100644
--- a/content/docs/tools/clarinet/(clarinet-cli)/deployment.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-cli)/deployment.mdx
@@ -419,6 +419,8 @@ When deploying, Clarinet prompts to overwrite manual changes. Type `no` to keep
+## Next steps
+
:::next-steps
- [Chainhook](/tools/chainhook): Learn how to monitor your contracts with Chainhook.
- [Contract monitoring](/tools/contract-monitoring): Learn how to monitor your contracts with Chainhook.
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
index 112618489..df91b6e50 100644
--- a/content/docs/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
@@ -464,6 +464,8 @@ $ clarinet devnet start --package demo-env.json
+## Next steps
+
:::next-steps
- [Contract interaction](/tools/clarinet/contract-interaction): Learn how to interact with your contracts.
- [Deployment](/tools/clarinet/deployment): Learn how to deploy your Clarinet project.
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/meta.json b/content/docs/en/tools/clarinet/(clarinet-cli)/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-cli)/meta.json
rename to content/docs/en/tools/clarinet/(clarinet-cli)/meta.json
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/project-development.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/project-development.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-cli)/project-development.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/project-development.mdx
index 968719bfc..6ff022a46 100644
--- a/content/docs/tools/clarinet/(clarinet-cli)/project-development.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-cli)/project-development.mdx
@@ -170,6 +170,8 @@ Now you can implement traits from mainnet contracts:
```
+## Next steps
+
:::next-steps
- [Contract interaction](/tools/clarinet/contract-interaction): Learn how to interact with your contracts.
- [Testing and validation](/tools/clarinet/validation-and-analysis): Learn how to test and validate your Clarinet project.
diff --git a/content/docs/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx b/content/docs/en/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
rename to content/docs/en/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
index 82e72ab1b..6096c2862 100644
--- a/content/docs/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
@@ -233,6 +233,8 @@ $ (contract-call? .vesting claim)
[32m(ok {claimed: u2500, remaining: u7500})[0m
```
+## Next steps
+
:::next-steps
- [Deployment](/tools/clarinet/deployment): Learn how to deploy your Clarinet project.
- [Clarinet SDK](/tools/clarinet/sdk-introduction): Learn how to use the Clarinet SDK.
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
index 1b248afa0..19696b9e5 100644
--- a/content/docs/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
@@ -7,6 +7,8 @@ description: Integration testing is a crucial step in smart contract development
import { ArrowRight, Check } from 'lucide-react';
+## What you'll learn
+
:::objectives
- Set up integration tests for multi-step workflows
- Testing contract interactions and dependencies
@@ -210,6 +212,8 @@ $ npm run test
| Timing issues | Use `simnet.mineEmptyBlocks()` to advance block height |
| Complex assertions | Break down into smaller, focused tests |
+## Next steps
+
:::next-steps
- [SDK reference](/tools/clarinet/sdk-reference): Learn more about the Clarinet JS SDK.
- [Stacks.js integration](/tools/clarinet/stacks-js-integration): Learn how to integrate Stacks.js with your Clarinet project.
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
index b3b1ddc60..ed425d3c7 100644
--- a/content/docs/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
@@ -122,6 +122,8 @@ Quickly experiment with MXS without setting up a project:
$ contract-call? 'SP000000000000000000002Q6VF78.pox-4 current-pox-reward-cycle
```
+## Next steps
+
:::next-steps
- [Pyth oracle integration](/tools/clarinet/pyth-oracle-integration): Learn how to integrate the Pyth oracle with your Clarinet project.
- [sBTC integration](/tools/clarinet/sbtc-integration): Learn how to integrate the sBTC with your Clarinet project.
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/meta.json b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/meta.json
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/meta.json
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
index c876a6d1e..e0a8f16da 100644
--- a/content/docs/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
@@ -283,6 +283,8 @@ export default defineConfig({
});
```
+## Next steps
+
:::next-steps
- [Unit testing](/tools/clarinet/unit-testing): Learn how to test your contract with unit testing.
- [SDK reference](/tools/clarinet/sdk-reference): Learn more about the Clarinet JS SDK.
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx
diff --git a/content/docs/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
rename to content/docs/en/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
index 12896f5e6..18f9bda26 100644
--- a/content/docs/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
+++ b/content/docs/en/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
@@ -8,6 +8,8 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/
import { ArrowRight, Check } from 'lucide-react';
+## What you'll learn
+
:::objectives
- Set up a Clarinet project for unit testing
- Write unit tests for public and read-only functions
@@ -205,6 +207,8 @@ Test Files 1 passed (1)
+## Next steps
+
:::next-steps
- [Integration testing](/tools/clarinet/integration-testing): Learn how to test your contract with integration testing.
- [Mainnet execution simulation](/tools/clarinet/mainnet-execution-simulation): Learn how to test your contract with mainnet state.
diff --git a/content/docs/tools/clarinet/(integrations)/chainhook-integration.mdx b/content/docs/en/tools/clarinet/(integrations)/chainhook-integration.mdx
similarity index 98%
rename from content/docs/tools/clarinet/(integrations)/chainhook-integration.mdx
rename to content/docs/en/tools/clarinet/(integrations)/chainhook-integration.mdx
index eac1eaa72..617a4cff2 100644
--- a/content/docs/tools/clarinet/(integrations)/chainhook-integration.mdx
+++ b/content/docs/en/tools/clarinet/(integrations)/chainhook-integration.mdx
@@ -4,6 +4,8 @@ sidebarTitle: Chainhook integration
description: In this guide, you'll learn how to register Chainhooks on devnet to monitor and react to smart contract events during local development.
---
+## What you'll learn
+
:::objectives
- Create Chainhook predicate files for event monitoring
- Register Chainhooks with Clarinet devnet
@@ -11,6 +13,8 @@ description: In this guide, you'll learn how to register Chainhooks on devnet to
- Set up webhooks for real-time notifications
:::
+## Prerequisites
+
:::prerequisites
- Clarinet version 2.1.0 or higher required. Check with `clarinet --version`.
- Node.js version 16 or higher required. Check with `node --version`.
diff --git a/content/docs/tools/clarinet/(integrations)/meta.json b/content/docs/en/tools/clarinet/(integrations)/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/(integrations)/meta.json
rename to content/docs/en/tools/clarinet/(integrations)/meta.json
diff --git a/content/docs/tools/clarinet/(integrations)/pyth-oracle-integration.mdx b/content/docs/en/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
rename to content/docs/en/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
index 36fb1344f..e6082306d 100644
--- a/content/docs/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
+++ b/content/docs/en/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
@@ -4,6 +4,8 @@ sidebarTitle: Pyth oracle integration
description: Learn how to test smart contracts that depend on Pyth oracle price feeds using Clarinet.
---
+## What you'll learn
+
:::objectives
- Set up mainnet contract dependencies
- Use mainnet transaction execution (MXS) for oracle testing
@@ -11,6 +13,8 @@ description: Learn how to test smart contracts that depend on Pyth oracle price
- Write integration tests with real oracle data
:::
+## Prerequisites
+
:::prerequisites
- Clarinet version 2.1.0 or higher with MXS support
diff --git a/content/docs/tools/clarinet/(integrations)/sbtc-integration.mdx b/content/docs/en/tools/clarinet/(integrations)/sbtc-integration.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(integrations)/sbtc-integration.mdx
rename to content/docs/en/tools/clarinet/(integrations)/sbtc-integration.mdx
index 341ae66d8..8c87bead1 100644
--- a/content/docs/tools/clarinet/(integrations)/sbtc-integration.mdx
+++ b/content/docs/en/tools/clarinet/(integrations)/sbtc-integration.mdx
@@ -4,6 +4,8 @@ sidebarTitle: sBTC integration
description: In this guide, you'll learn how to interact with the mainnet sBTC contract in your Clarinet project.
---
+## What you'll learn
+
:::objectives
- Add sBTC smart contracts to your Clarinet project
- Test contracts with automatic sBTC funding in devnet
@@ -11,6 +13,8 @@ description: In this guide, you'll learn how to interact with the mainnet sBTC c
- Deploy sBTC contracts to testnet and mainnet
:::
+## Prerequisites
+
:::prerequisites
- Clarinet 2.15.0 or later required for automatic sBTC integration.
:::
diff --git a/content/docs/tools/clarinet/(integrations)/stacks-js-integration.mdx b/content/docs/en/tools/clarinet/(integrations)/stacks-js-integration.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(integrations)/stacks-js-integration.mdx
rename to content/docs/en/tools/clarinet/(integrations)/stacks-js-integration.mdx
index b1eaef908..54cb6e514 100644
--- a/content/docs/tools/clarinet/(integrations)/stacks-js-integration.mdx
+++ b/content/docs/en/tools/clarinet/(integrations)/stacks-js-integration.mdx
@@ -4,6 +4,8 @@ sidebarTitle: Stacks.js integration
description: In this guide, you'll learn how to interacts with your smart contracts on devnet using the Stacks.js libraries.
---
+## What you'll learn
+
:::objectives
- Configure Stacks.js for local devnet connection
- Make STX transfers between devnet accounts
diff --git a/content/docs/tools/clarinet/(overview)/faq.mdx b/content/docs/en/tools/clarinet/(overview)/faq.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(overview)/faq.mdx
rename to content/docs/en/tools/clarinet/(overview)/faq.mdx
diff --git a/content/docs/tools/clarinet/(overview)/meta.json b/content/docs/en/tools/clarinet/(overview)/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/(overview)/meta.json
rename to content/docs/en/tools/clarinet/(overview)/meta.json
diff --git a/content/docs/tools/clarinet/(overview)/project-structure.mdx b/content/docs/en/tools/clarinet/(overview)/project-structure.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(overview)/project-structure.mdx
rename to content/docs/en/tools/clarinet/(overview)/project-structure.mdx
index efd28b42e..9544eacec 100644
--- a/content/docs/tools/clarinet/(overview)/project-structure.mdx
+++ b/content/docs/en/tools/clarinet/(overview)/project-structure.mdx
@@ -268,6 +268,8 @@ Never commit mainnet private keys or mnemonics. Use environment variables for pr
+## Next steps
+
:::next-steps
- [Writing Clarity contracts](/tools/clarinet/project-development): Create and manage Clarity contracts.
- [Testing and validation](/tools/clarinet/contract-interaction): Interact with Clarity contracts in your project.
diff --git a/content/docs/tools/clarinet/(overview)/quickstart.mdx b/content/docs/en/tools/clarinet/(overview)/quickstart.mdx
similarity index 99%
rename from content/docs/tools/clarinet/(overview)/quickstart.mdx
rename to content/docs/en/tools/clarinet/(overview)/quickstart.mdx
index a6a28a06c..e9ba6a567 100644
--- a/content/docs/tools/clarinet/(overview)/quickstart.mdx
+++ b/content/docs/en/tools/clarinet/(overview)/quickstart.mdx
@@ -3,12 +3,16 @@ title: Quickstart
description: In this guide, you'll build a simple counter smart contract and interact with it in a local environment.
---
+## What you'll learn
+
:::objectives
- Create a Clarity smart contract project
- Write Clarity code with maps and public functions
- Test and validate your contracts using Clarinet's console
:::
+## Prerequisites
+
:::prerequisites
- Clarinet installed on your machine. Follow the [installation guide](/tools/clarinet#installation) if needed.
- A code editor like VS Code for editing Clarity files.
@@ -146,6 +150,8 @@ description: In this guide, you'll build a simple counter smart contract and int
+## Next steps
+
:::next-steps
- [Project structure](/tools/clarinet/project-structure): Learn about the project structure and how to manage your contracts.
- [Local blockchain development](/tools/clarinet/local-blockchain-development): Spin up a local blockchain to test your contracts.
diff --git a/content/docs/tools/clarinet/(vscode-extension)/meta.json b/content/docs/en/tools/clarinet/(vscode-extension)/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/(vscode-extension)/meta.json
rename to content/docs/en/tools/clarinet/(vscode-extension)/meta.json
diff --git a/content/docs/tools/clarinet/(vscode-extension)/vscode-extension.mdx b/content/docs/en/tools/clarinet/(vscode-extension)/vscode-extension.mdx
similarity index 100%
rename from content/docs/tools/clarinet/(vscode-extension)/vscode-extension.mdx
rename to content/docs/en/tools/clarinet/(vscode-extension)/vscode-extension.mdx
diff --git a/content/docs/tools/clarinet/index.mdx b/content/docs/en/tools/clarinet/index.mdx
similarity index 99%
rename from content/docs/tools/clarinet/index.mdx
rename to content/docs/en/tools/clarinet/index.mdx
index 67d93a8f8..1bb02ff75 100644
--- a/content/docs/tools/clarinet/index.mdx
+++ b/content/docs/en/tools/clarinet/index.mdx
@@ -44,6 +44,8 @@ To explore Clarinet features with AI, copy and paste [llms.txt](/tools/clarinet/
```
+## Next steps
+
:::next-steps
- [Quickstart](/tools/clarinet/quickstart): Get started with Clarinet.
- [Create a project](/tools/clarinet/project-development): Create a new Clarinet project.
diff --git a/content/docs/tools/clarinet/meta.json b/content/docs/en/tools/clarinet/meta.json
similarity index 100%
rename from content/docs/tools/clarinet/meta.json
rename to content/docs/en/tools/clarinet/meta.json
diff --git a/content/docs/tools/contract-monitoring/create-alert.mdx b/content/docs/en/tools/contract-monitoring/create-alert.mdx
similarity index 98%
rename from content/docs/tools/contract-monitoring/create-alert.mdx
rename to content/docs/en/tools/contract-monitoring/create-alert.mdx
index 193f87ea5..8d8e719e4 100644
--- a/content/docs/tools/contract-monitoring/create-alert.mdx
+++ b/content/docs/en/tools/contract-monitoring/create-alert.mdx
@@ -3,12 +3,16 @@ title: Create an alert
description: Learn how to create an alert to monitor function calls for a contract.
---
+## What you'll learn
+
:::objectives
- Set up alerts for contract functions
- Configure email and webhook notifications
- Monitor contract usage patterns
:::
+## Prerequisites
+
:::prerequisites
- Contracts deployed to Stacks mainnet (or use any public contract)
- A Hiro Platform account - [Sign up free](https://platform.hiro.so)
@@ -166,6 +170,8 @@ interface Principal {
The `tx_status` will always return "pending" for monitor alerts. Notifications are sent when transactions hit the mempool, not when they're confirmed on the blockchain.
:::
+## Next steps
+
:::next-steps
- [Hiro Platform](https://platform.hiro.so): Create and manage new webhooks in the Platform.
- [Chainhook](/tools/chainhook): Learn about advanced event monitoring with Chainhook
diff --git a/content/docs/tools/contract-monitoring/index.mdx b/content/docs/en/tools/contract-monitoring/index.mdx
similarity index 98%
rename from content/docs/tools/contract-monitoring/index.mdx
rename to content/docs/en/tools/contract-monitoring/index.mdx
index 9c3dd747e..10d06ea79 100644
--- a/content/docs/tools/contract-monitoring/index.mdx
+++ b/content/docs/en/tools/contract-monitoring/index.mdx
@@ -14,6 +14,8 @@ To explore Contract monitoring features with AI, copy and paste [llms.txt](/tool
- **Real-time notifications** - Target specific events and receive webhooks within seconds
- **No-code setup** - Configure monitors through the Platform UI without writing code
+## Next steps
+
:::next-steps
- [Create an alert](/tools/contract-monitoring/create-alert): Set up your first alert for function calls.
- [Chainhooks](/tools/chainhook): Learn more about Chainhooks and how they differ from contract monitoring.
diff --git a/content/docs/tools/contract-monitoring/meta.json b/content/docs/en/tools/contract-monitoring/meta.json
similarity index 100%
rename from content/docs/tools/contract-monitoring/meta.json
rename to content/docs/en/tools/contract-monitoring/meta.json
diff --git a/content/docs/es/apis/ordinals-api/index.mdx b/content/docs/es/apis/ordinals-api/index.mdx
new file mode 100644
index 000000000..0b0a932aa
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/index.mdx
@@ -0,0 +1,35 @@
+---
+title: API de Ordinales
+sidebarTitle: Visión general
+description: Datos rápidos y confiables para ordinales de Bitcoin y tokens BRC-20 a través de REST.
+llm: false
+---
+## Visión general
+
+La API de Ordinals proporciona datos completos de inscripciones para ordinales de Bitcoin a través de una interfaz REST de alto rendimiento. Construida con respuestas en caché e indexación optimizada, ofrece metadatos de inscripciones, actividad de trading, información de tokens BRC-20 y datos a nivel de satoshi con latencia mínima.
+
+## Características principales
+
+* **Datos completos de inscripción** - Metadatos, contenido y propiedad de todos los ordinales
+* **Soporte para tokens BRC-20** - Metadatos completos de tokens, saldos e información del titular
+* **Seguimiento a nivel Satoshi** - Datos de inscripción vinculados a satoshis específicos
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/ordinals/v1/inscriptions' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/ordinals-api/usage).
+
+:::callout
+Todas las respuestas de la API de Ordinals incluyen [límites de tasa de encabezados](/resources/guides/response-headers) que te ayudan a monitorear el uso de tu API con información de cuota específica de Bitcoin.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de Ordinals?
+
+Contáctanos en el #ordinales canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/ordinals-api/meta.json b/content/docs/es/apis/ordinals-api/meta.json
new file mode 100644
index 000000000..ec20236a6
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Ordinals API",
+ "root": true,
+ "pages": ["---Ordinals API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx
new file mode 100644
index 000000000..032c10f6a
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener actividad BRC-20
+sidebarTitle: Actividad BRC-20
+description: Recupera la actividad BRC-20 filtrada por ticker, dirección, operación o altura de bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx
new file mode 100644
index 000000000..8fd65852d
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener saldos BRC-20
+sidebarTitle: Saldos BRC-20
+description: Recupera los saldos de tokens BRC-20 para una dirección de Bitcoin.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx
new file mode 100644
index 000000000..30ac6cd62
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener detalles del token BRC-20
+sidebarTitle: Detalles del token BRC-20
+description: Recupera información de un token BRC-20, incluyendo suministro y titulares.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx
new file mode 100644
index 000000000..13d371cb8
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener titulares de tokens BRC-20
+sidebarTitle: Titulares de tokens BRC-20
+description: Recupera una lista de titulares y sus saldos para un token BRC-20 específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx
new file mode 100644
index 000000000..a6780c475
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtén tokens BRC-20
+sidebarTitle: Tokens BRC-20
+description: Recupera información para tokens BRC-20.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/brc20/index.mdx b/content/docs/es/apis/ordinals-api/reference/brc20/index.mdx
new file mode 100644
index 000000000..5a38b58c5
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/brc20/index.mdx
@@ -0,0 +1,6 @@
+---
+title: BRC-20
+index: true
+full: true
+description: Recupera información sobre tokens BRC-20.
+---
diff --git a/content/docs/es/apis/ordinals-api/reference/info/index.mdx b/content/docs/es/apis/ordinals-api/reference/info/index.mdx
new file mode 100644
index 000000000..cffa47cb7
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/info/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Estado
+index: true
+full: true
+description: Recupera información sobre el estado de la API de Ordinals, incluyendo la versión del servidor.
+---
diff --git a/content/docs/es/apis/ordinals-api/reference/info/status.mdx b/content/docs/es/apis/ordinals-api/reference/info/status.mdx
new file mode 100644
index 000000000..bb179d3af
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/info/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener estado de la API
+sidebarTitle: Estado de la API
+description: Recupera el estado de funcionamiento de la API de Ordinals.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx
new file mode 100644
index 000000000..736048147
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener contenido de inscripción
+sidebarTitle: Contenido de la inscripción
+description: Recupera el contenido de una sola inscripción.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx
new file mode 100644
index 000000000..2757ee19c
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transferencias de inscripciones
+sidebarTitle: Transferencias de inscripciones
+description: Recupera todas las transferencias de una única inscripción.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription.mdx
new file mode 100644
index 000000000..4cf8c8d82
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscription.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener inscripción
+sidebarTitle: Inscripción
+description: Recupera una única inscripción.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx
new file mode 100644
index 000000000..3d8187b42
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener inscripciones
+sidebarTitle: Inscripciones
+description: Recupera una lista de inscripciones con opciones para filtrar y ordenar los resultados.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx
new file mode 100644
index 000000000..72a230999
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transferencias por bloque
+sidebarTitle: Transferencias por bloque
+description: Obtiene una lista de transferencias de inscripciones que ocurrieron en un bloque específico de Bitcoin.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/inscriptions/index.mdx b/content/docs/es/apis/ordinals-api/reference/inscriptions/index.mdx
new file mode 100644
index 000000000..bdb92d14f
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/inscriptions/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Inscripciones
+index: true
+full: true
+description: Recupera información sobre inscripciones de Ordinals.
+---
diff --git a/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx b/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx
new file mode 100644
index 000000000..97bfbea88
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtén inscripciones satoshi
+sidebarTitle: Inscripciones Satoshi
+description: Recupera todas las inscripciones asociadas a un solo satoshi.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi.mdx b/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi.mdx
new file mode 100644
index 000000000..5a05aba03
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/satoshis/get-satoshi.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener ordinal de satoshi
+sidebarTitle: Ordinal de Satoshi
+description: Recupera información ordinal para un solo satoshi.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/satoshis/index.mdx b/content/docs/es/apis/ordinals-api/reference/satoshis/index.mdx
new file mode 100644
index 000000000..dfcdcb99f
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/satoshis/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Satoshis
+index: true
+full: true
+description: Recupera información ordinal para satoshis.
+---
diff --git a/content/docs/es/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx b/content/docs/es/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx
new file mode 100644
index 000000000..446d3aca0
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el recuento de inscripciones por bloque
+sidebarTitle: Recuento de inscripciones por bloque
+description: Recupera estadísticas sobre el número de inscripciones reveladas por bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/ordinals-api/reference/statistics/index.mdx b/content/docs/es/apis/ordinals-api/reference/statistics/index.mdx
new file mode 100644
index 000000000..5044bef3d
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/reference/statistics/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Estadísticas
+index: true
+full: true
+description: Recupera estadísticas sobre el número de inscripciones por bloque.
+---
diff --git a/content/docs/es/apis/ordinals-api/usage.mdx b/content/docs/es/apis/ordinals-api/usage.mdx
new file mode 100644
index 000000000..05ea81c87
--- /dev/null
+++ b/content/docs/es/apis/ordinals-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de Ordinals.
+---
+## Uso
+
+La API de Ordinals está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de Ordinals, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.hiro.so/ordinals/v1/inscriptions' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Si estás utilizando una api-key, reemplaza `$HIRO_API_KEY` con tu clave API secreta.
+
+```terminal
+$ curl -L 'https://api.hiro.so/ordinals/v1/inscriptions' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Códigos de respuesta
+
+La API de Ordinals utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de la solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Verifique que los parámetros fueran correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/apis/platform-api/index.mdx b/content/docs/es/apis/platform-api/index.mdx
new file mode 100644
index 000000000..ab42b070a
--- /dev/null
+++ b/content/docs/es/apis/platform-api/index.mdx
@@ -0,0 +1,31 @@
+---
+title: API de la plataforma
+sidebarTitle: Visión general
+description: Acceso programático a devnet y gestión de chainhook a través de REST.
+llm: false
+---
+## Visión general
+
+La API de la Plataforma proporciona control programático sobre los servicios de la Plataforma Hiro a través de una interfaz REST. Diseñada para automatización e integración de CI/CD, te permite crear y gestionar chainhooks, controlar devnets alojados en la plataforma e interactuar con servicios blockchain directamente desde el código de tu aplicación.
+
+## Características principales
+
+* **Automatización de Chainhook** - Crear, actualizar y eliminar chainhooks de forma programática
+* **Control de devnet** - Iniciar, detener e interactuar con redes de desarrollo alojadas en la plataforma
+* **Integración de CI/CD** - Automatice los flujos de trabajo de blockchain en su proceso de desarrollo
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/platform-api/usage).
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de la Plataforma?
+
+Contáctanos en el #plataforma-hiro canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/platform-api/meta.json b/content/docs/es/apis/platform-api/meta.json
new file mode 100644
index 000000000..cb535833d
--- /dev/null
+++ b/content/docs/es/apis/platform-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Platform API",
+ "root": true,
+ "pages": ["---Platform API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/create.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/create.mdx
new file mode 100644
index 000000000..69de47f89
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/create.mdx
@@ -0,0 +1,7 @@
+---
+title: Crear un chainhook
+sidebarTitle: Crear
+description: Crea un chainhook a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/delete.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/delete.mdx
new file mode 100644
index 000000000..bcc02c275
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/delete.mdx
@@ -0,0 +1,7 @@
+---
+title: Eliminar un chainhook
+sidebarTitle: Eliminar
+description: Eliminar un chainhook a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/get.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/get.mdx
new file mode 100644
index 000000000..0fc987ba2
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/get.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener un chainhook específico
+sidebarTitle: Obtener
+description: Obtén un chainhook específico a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/index.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/index.mdx
new file mode 100644
index 000000000..89a897bb2
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Chainhooks
+index: true
+full: true
+description: Obtiene información sobre la API de Platform Chainhooks.
+---
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/list.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/list.mdx
new file mode 100644
index 000000000..aa0652373
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/list.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener todos los chainhooks
+sidebarTitle: Lista
+description: Obtén todos tus chainhooks a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/status.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/status.mdx
new file mode 100644
index 000000000..aaa9accea
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el estado de un chainhook
+sidebarTitle: Estado
+description: Recupera el estado de un chainhook específico a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/chainhooks/update.mdx b/content/docs/es/apis/platform-api/reference/chainhooks/update.mdx
new file mode 100644
index 000000000..23d8d0e7c
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/chainhooks/update.mdx
@@ -0,0 +1,7 @@
+---
+title: Actualizar un chainhook
+sidebarTitle: Actualizar
+description: Actualiza un chainhook a través de la Plataforma Hiro.
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/devnet/bitcoin-node.mdx b/content/docs/es/apis/platform-api/reference/devnet/bitcoin-node.mdx
new file mode 100644
index 000000000..a24be408d
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/devnet/bitcoin-node.mdx
@@ -0,0 +1,7 @@
+---
+title: Nodo de Bitcoin
+sidebarTitle: Nodo de Bitcoin
+description: Proxy para el nodo de Bitcoin en una red de desarrollo (devnet).
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/devnet/index.mdx b/content/docs/es/apis/platform-api/reference/devnet/index.mdx
new file mode 100644
index 000000000..41b2219d7
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/devnet/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Devnet
+index: true
+full: true
+description: Recupera información sobre los servicios de Platform Devnet como Stacks Blockchain API, nodo Bitcoin y más.
+---
diff --git a/content/docs/es/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx b/content/docs/es/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx
new file mode 100644
index 000000000..d54f151d5
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx
@@ -0,0 +1,7 @@
+---
+title: API de Blockchain de Stacks
+sidebarTitle: API de Blockchain de Stacks
+description: Proxy para la API de la Blockchain de Stacks en una red de desarrollo (devnet).
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/devnet/start.mdx b/content/docs/es/apis/platform-api/reference/devnet/start.mdx
new file mode 100644
index 000000000..a13f0d1cc
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/devnet/start.mdx
@@ -0,0 +1,7 @@
+---
+title: Iniciar devnet
+sidebarTitle: Iniciar devnet
+description: Iniciar una red de desarrollo (devnet).
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/reference/devnet/stop.mdx b/content/docs/es/apis/platform-api/reference/devnet/stop.mdx
new file mode 100644
index 000000000..3a14b55a9
--- /dev/null
+++ b/content/docs/es/apis/platform-api/reference/devnet/stop.mdx
@@ -0,0 +1,7 @@
+---
+title: Detener devnet
+sidebarTitle: Detener devnet
+description: Detener una red de desarrollo (devnet).
+full: true
+---
+
diff --git a/content/docs/es/apis/platform-api/usage.mdx b/content/docs/es/apis/platform-api/usage.mdx
new file mode 100644
index 000000000..cf7d8092d
--- /dev/null
+++ b/content/docs/es/apis/platform-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de la Plataforma.
+---
+## Uso
+
+La API de la Plataforma está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.platform.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de la Plataforma, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+La API de la plataforma utiliza autenticación basada en rutas. Reemplace `{apiKey}` en la ruta URL con tu clave de API de Platform.
+
+```terminal
+$ curl -L 'https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks' \
+ -H 'Accept: application/json' \
+ -H 'Content-Type: application/json'
+```
+
+## Códigos de respuesta
+
+La API de la Plataforma utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de la solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Verifique que los parámetros fueran correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/apis/runes-api/index.mdx b/content/docs/es/apis/runes-api/index.mdx
new file mode 100644
index 000000000..c0370c7e3
--- /dev/null
+++ b/content/docs/es/apis/runes-api/index.mdx
@@ -0,0 +1,35 @@
+---
+title: API de Runas
+sidebarTitle: Visión general
+description: Datos rápidos y confiables para Bitcoin Runes a través de REST.
+llm: false
+---
+## Visión general
+
+La API de Runes proporciona datos completos para Bitcoin Runes a través de una interfaz REST de alto rendimiento. Construida con respuestas en caché e indexación optimizada, ofrece metadatos de runas, actividad comercial, información de titulares y detalles de grabado con una latencia mínima.
+
+## Características principales
+
+* **Cobertura completa de runas** - Metadatos para todos los grabados y actividad rúnica
+* **Seguimiento de titulares** - Saldos y datos de propiedad para los poseedores de rune
+* **Monitoreo de actividad** - Seguimiento en tiempo real de transferencias y operaciones de runas
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/runes/v1/etchings' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/runes-api/usage).
+
+:::callout
+Todas las respuestas de la API de Runes incluyen [límites de tasa de encabezados](/resources/guides/response-headers) que te ayudan a monitorear el uso de tu API con información de cuota específica de Bitcoin.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de Runes?
+
+Contáctanos en el #ordinales canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/runes-api/meta.json b/content/docs/es/apis/runes-api/meta.json
new file mode 100644
index 000000000..ea8e3a6eb
--- /dev/null
+++ b/content/docs/es/apis/runes-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Runes API",
+ "root": true,
+ "pages": ["---Runes API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/runes-api/reference/activities/activity.mdx b/content/docs/es/apis/runes-api/reference/activities/activity.mdx
new file mode 100644
index 000000000..73a60609a
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/activities/activity.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener toda la actividad
+sidebarTitle: Toda la actividad
+description: Recupera toda la actividad de una Runa.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/activities/for-address.mdx b/content/docs/es/apis/runes-api/reference/activities/for-address.mdx
new file mode 100644
index 000000000..764c01a82
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/activities/for-address.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener actividad para una dirección
+sidebarTitle: Actividad de una dirección
+description: Recupera toda la actividad de Rune para una dirección de Bitcoin.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/activities/for-block.mdx b/content/docs/es/apis/runes-api/reference/activities/for-block.mdx
new file mode 100644
index 000000000..d9f5901b1
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/activities/for-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener actividad para un bloque
+sidebarTitle: Actividad para un bloque
+description: Obtiene una lista paginada de actividad de runas para un bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/activities/for-transaction.mdx b/content/docs/es/apis/runes-api/reference/activities/for-transaction.mdx
new file mode 100644
index 000000000..84c98ca08
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/activities/for-transaction.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener actividad para una transacción
+sidebarTitle: Actividad de una transacción
+description: Obtiene una lista paginada de actividad de runas para una transacción.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/activities/index.mdx b/content/docs/es/apis/runes-api/reference/activities/index.mdx
new file mode 100644
index 000000000..9019b8b64
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/activities/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Actividades
+index: true
+full: true
+description: Recupera información sobre actividades de Runa.
+---
diff --git a/content/docs/es/apis/runes-api/reference/balances/address.mdx b/content/docs/es/apis/runes-api/reference/balances/address.mdx
new file mode 100644
index 000000000..002c080d8
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/balances/address.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener saldos de direcciones
+sidebarTitle: Saldos de direcciones
+description: Recupera una lista paginada de saldos de direcciones.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/balances/holder-balance.mdx b/content/docs/es/apis/runes-api/reference/balances/holder-balance.mdx
new file mode 100644
index 000000000..b06b360e9
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/balances/holder-balance.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener saldo del titular
+sidebarTitle: Saldo del titular
+description: Recupera el saldo del titular para una Runa específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/balances/holders.mdx b/content/docs/es/apis/runes-api/reference/balances/holders.mdx
new file mode 100644
index 000000000..573182af5
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/balances/holders.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener portadores de runas
+sidebarTitle: Portadores de runas
+description: Recupera una lista paginada de poseedores de una Runa.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/balances/index.mdx b/content/docs/es/apis/runes-api/reference/balances/index.mdx
new file mode 100644
index 000000000..f1b5542f4
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/balances/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Saldos
+index: true
+full: true
+description: Recupera información sobre los saldos de Rune.
+---
diff --git a/content/docs/es/apis/runes-api/reference/etchings/get-etching.mdx b/content/docs/es/apis/runes-api/reference/etchings/get-etching.mdx
new file mode 100644
index 000000000..08c8ac562
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/etchings/get-etching.mdx
@@ -0,0 +1,7 @@
+---
+title: Ponte a grabar
+sidebarTitle: Grabado
+description: Recupera información para un grabado de Runa.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/etchings/get-etchings.mdx b/content/docs/es/apis/runes-api/reference/etchings/get-etchings.mdx
new file mode 100644
index 000000000..b9c7d2635
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/etchings/get-etchings.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener grabados
+sidebarTitle: Grabados
+description: Recupera una lista paginada de grabados rúnicos.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/reference/etchings/index.mdx b/content/docs/es/apis/runes-api/reference/etchings/index.mdx
new file mode 100644
index 000000000..399ddfd38
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/etchings/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Grabados
+index: true
+full: true
+description: Recupera información sobre grabados rúnicos.
+---
diff --git a/content/docs/es/apis/runes-api/reference/info/index.mdx b/content/docs/es/apis/runes-api/reference/info/index.mdx
new file mode 100644
index 000000000..486da5675
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/info/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Estado
+index: true
+full: true
+description: Recupera información sobre el estado de la API de Rune.
+---
diff --git a/content/docs/es/apis/runes-api/reference/info/status.mdx b/content/docs/es/apis/runes-api/reference/info/status.mdx
new file mode 100644
index 000000000..ac9e8221e
--- /dev/null
+++ b/content/docs/es/apis/runes-api/reference/info/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener Estado de la API
+sidebarTitle: Estado de la API
+description: Recupera el estado de la API.
+full: true
+---
+
diff --git a/content/docs/es/apis/runes-api/usage.mdx b/content/docs/es/apis/runes-api/usage.mdx
new file mode 100644
index 000000000..74df85e2e
--- /dev/null
+++ b/content/docs/es/apis/runes-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de Runes.
+---
+## Uso
+
+La API de Runes está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de Runes, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.hiro.so/runes/v1/etchings' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Si estás utilizando una api-key, reemplaza `$HIRO_API_KEY` con tu clave API secreta.
+
+```terminal
+$ curl -L 'https://api.hiro.so/runes/v1/etchings' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Códigos de respuesta
+
+La API de Runes utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de la solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Verifique que los parámetros fueran correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/apis/signer-metrics-api/index.mdx b/content/docs/es/apis/signer-metrics-api/index.mdx
new file mode 100644
index 000000000..d89910656
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/index.mdx
@@ -0,0 +1,31 @@
+---
+title: API de métricas del firmante
+sidebarTitle: Visión general
+description: Monitorea y analiza el comportamiento de los firmantes en la red Stacks a través de REST.
+llm: false
+---
+## Visión general
+
+La API de Métricas de Firmantes proporciona capacidades de monitoreo exhaustivas para los firmantes en la red Stacks a través de una interfaz REST. Diseñada para el análisis de la red y el seguimiento del rendimiento, ofrece información detallada sobre los firmantes activos, las tasas de aceptación de bloques y las métricas de tiempo a lo largo de los ciclos PoX.
+
+## Características principales
+
+* **Monitoreo del firmante** - Realizar un seguimiento de los firmantes activos y sus métricas de rendimiento
+* **Análisis de bloques** - Información agregada del firmante para la validación de bloques
+* **Seguimiento del ciclo de PoX** - Monitorear la participación de los firmantes a lo largo de los ciclos
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/signer-metrics/v1/cycles/95/signers' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/signer-metrics-api/usage).
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de Métricas del Firmante?
+
+Contáctanos en el #api canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/signer-metrics-api/meta.json b/content/docs/es/apis/signer-metrics-api/meta.json
new file mode 100644
index 000000000..19a002f36
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Signer Metrics API",
+ "root": true,
+ "pages": ["---Signer Metrics API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/signer-metrics-api/reference/block-proposals/index.mdx b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/index.mdx
new file mode 100644
index 000000000..4ff134eac
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Block proposals
+description: Obtener información sobre propuestas de bloques.
+full: true
+index: true
+---
diff --git a/content/docs/es/apis/signer-metrics-api/reference/block-proposals/mtea.json b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/mtea.json
new file mode 100644
index 000000000..4c880c22a
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/mtea.json
@@ -0,0 +1,4 @@
+{
+ "title": "Block proposals",
+ "pages": ["..."]
+}
diff --git a/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx
new file mode 100644
index 000000000..d2105e3e4
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Información del firmante para un bloque
+sidebarTitle: Información del firmante para la propuesta de bloque
+description: Obtener información del firmante para un bloque específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx
new file mode 100644
index 000000000..afac5f811
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx
@@ -0,0 +1,7 @@
+---
+title: Información del firmante para las propuestas de bloques más recientes
+sidebarTitle: Información del firmante para propuestas recientes
+description: Obtener información del firmante para las propuestas de bloques más recientes.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx b/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx
new file mode 100644
index 000000000..5d36e56c5
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Información agregada del firmante para un bloque
+sidebarTitle: Información del firmante del bloque
+description: Obtén información agregada del firmante para un bloque específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx b/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx
new file mode 100644
index 000000000..7096a1fd3
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx
@@ -0,0 +1,7 @@
+---
+title: Información agregada del firmante para los bloques más recientes
+sidebarTitle: Información del firmante para bloques recientes
+description: Obtener información agregada del firmante para los bloques más recientes.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/blocks/index.mdx b/content/docs/es/apis/signer-metrics-api/reference/blocks/index.mdx
new file mode 100644
index 000000000..1a9dca591
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/blocks/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Blocks
+description: Obtén información agregada del firmante para los bloques.
+full: true
+index: true
+---
diff --git a/content/docs/es/apis/signer-metrics-api/reference/blocks/meta.json b/content/docs/es/apis/signer-metrics-api/reference/blocks/meta.json
new file mode 100644
index 000000000..61480c519
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/blocks/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Blocks",
+ "pages": ["..."]
+}
diff --git a/content/docs/es/apis/signer-metrics-api/reference/info/index.mdx b/content/docs/es/apis/signer-metrics-api/reference/info/index.mdx
new file mode 100644
index 000000000..507f6d820
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/info/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Info
+description: Puntos finales del estado del servicio
+full: true
+index: true
+---
diff --git a/content/docs/es/apis/signer-metrics-api/reference/info/meta.json b/content/docs/es/apis/signer-metrics-api/reference/info/meta.json
new file mode 100644
index 000000000..5df3dcd09
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/info/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Info",
+ "pages": ["..."]
+}
diff --git a/content/docs/es/apis/signer-metrics-api/reference/info/status.mdx b/content/docs/es/apis/signer-metrics-api/reference/info/status.mdx
new file mode 100644
index 000000000..ad9795b81
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/info/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Estado de la API
+sidebarTitle: Estado de la API
+description: Muestra el estado de la API y su carga de trabajo actual.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/signers/index.mdx b/content/docs/es/apis/signer-metrics-api/reference/signers/index.mdx
new file mode 100644
index 000000000..4b4397b41
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/signers/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Signers
+description: Obtén información sobre los firmantes en la cadena de bloques de Stacks.
+full: true
+index: true
+---
diff --git a/content/docs/es/apis/signer-metrics-api/reference/signers/meta.json b/content/docs/es/apis/signer-metrics-api/reference/signers/meta.json
new file mode 100644
index 000000000..ce236a503
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/signers/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Signers",
+ "pages": ["..."]
+}
diff --git a/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx b/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx
new file mode 100644
index 000000000..de8e76ecb
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx
@@ -0,0 +1,7 @@
+---
+title: Firmante del Ciclo PoX
+sidebarTitle: Firmante del Ciclo PoX
+description: Obtén estadísticas para un firmante específico en un ciclo PoX determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx b/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx
new file mode 100644
index 000000000..9365fb0f4
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx
@@ -0,0 +1,7 @@
+---
+title: Firmantes del Ciclo PoX
+sidebarTitle: Firmantes del Ciclo PoX
+description: Obtén una lista de firmantes en un ciclo PoX determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/signer-metrics-api/usage.mdx b/content/docs/es/apis/signer-metrics-api/usage.mdx
new file mode 100644
index 000000000..2c99ba51f
--- /dev/null
+++ b/content/docs/es/apis/signer-metrics-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de Métricas del Firmante.
+---
+## Uso
+
+La API de Métricas del Firmante está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de Métricas del Firmante, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.hiro.so/signer-metrics/v1/cycles/95/signers' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Si estás utilizando una api-key, reemplaza `$HIRO_API_KEY` con tu clave API secreta.
+
+```terminal
+$ curl -L 'https://api.hiro.so/signer-metrics/v1/cycles/95/signers' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Códigos de respuesta
+
+La API de Métricas del Firmante utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de la solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Verifique que los parámetros fueran correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/apis/stacks-blockchain-api/architecture.mdx b/content/docs/es/apis/stacks-blockchain-api/architecture.mdx
new file mode 100644
index 000000000..3f99615f9
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/architecture.mdx
@@ -0,0 +1,57 @@
+---
+title: Arquitectura
+description: Comprende la arquitectura de la API de la Blockchain de Stacks.
+---
+
+
+## Puntos finales RPC
+
+El `stacks-node` tiene su propio conjunto mínimo de puntos finales http conocidos como `RPC endpoints`.
+
+* El `stacks-blockchain-api` permite a los clientes acceder a los puntos finales RPC mediante el proxy de solicitudes a un grupo balanceado de carga de `stacks-nodes`.
+* Para obtener más detalles sobre los puntos finales RPC, consulte: [Documentación de Puntos de Conexión RPC](https://github.com/blockstack/stacks-blockchain/blob/master/docs/rpc-endpoints.md)
+* Los puntos finales RPC comunes incluyen:
+ * `POST /v2/transactions` - Transmitir una transacción
+ * `GET /v2/pox` - Recuperar información relevante actual de Prueba de Transferencia (PoX)
+ * `POST /v2/contracts/call-read//` - Evaluar y devolver el resultado de llamar a una función de Clarity
+ * `POST /v2/fees/transaction` - Evaluar una transacción dada y proporcionar datos de estimación de tarifas de transacción
+ * `GET /v2/accounts/` - Obtener el nonce actual requerido para crear transacciones
+
+## Puntos finales adicionales
+
+La API de la cadena de bloques Stacks implementa puntos finales adicionales que proporcionan datos no disponibles directamente desde los nodos de Stacks debido a diversas limitaciones.
+
+* El `stacks-node` es posible que no persista ciertos datos o que no los sirva eficientemente a muchos clientes. Por ejemplo, aunque puede devolver el saldo actual de STX de una cuenta, no puede proporcionar un historial de transacciones de la cuenta.
+* La API implementa la especificación Rosetta de Coinbase, un estándar abierto diseñado para simplificar la implementación e interacción con blockchain. Se puede encontrar más información en [API de Rosetta](https://www.rosetta-api.org/).
+* La API incluye soporte para los puntos finales del Sistema de Nombres de Blockchain (BNS). Los detalles están disponibles en [Documentación de BNS](https://docs.stacks.co/clarity/example-contracts/bns).
+* Para las rutas de Express.js, consulte el directorio `/src/api/routes`.
+
+La API crea un servidor http "observador de eventos" que escucha eventos de un "emisor de eventos" de stacks-node.
+
+Los eventos son solicitudes HTTP POST que contienen:
+
+* Bloques
+* Transacciones
+
+Subproductos de las transacciones ejecutadas, tales como:
+
+* Transferencias de activos
+* Datos de registro de contratos inteligentes
+* Datos de costo de ejecución
+
+La API procesa y almacena estos eventos como datos relacionales en PostgreSQL. Para el código del "observador de eventos", consulte `/src/event-stream`.
+
+## OpenAPI y JSON Schema
+
+Todos los endpoints http y las respuestas están definidos en OpenAPI y JSON Schema.
+
+* Ver `/docs/openapi.yaml`
+* Estos se utilizan para generar automáticamente la documentación en https://hirosystems.github.io/stacks-blockchain-api/
+* Los esquemas JSON se convierten en interfaces de TypeScript, que son utilizadas internamente por el módulo controlador de la base de datos para transformar los resultados de las consultas SQL en las formas de objeto correctas.
+* OpenAPI y los esquemas JSON también se utilizan para generar un independiente `@stacks/blockchain-api-client`.
+
+## Configuración de Desarrollo
+
+La forma más fácil/rápida de desarrollar en este repositorio es usando el depurador de VS Code. Utiliza docker-compose para configurar una instancia de stacks-node y Postgres.
+
+Alternativamente, puedes ejecutar `npm run dev:integrated` que hace lo mismo pero sin un depurador.
diff --git a/content/docs/es/apis/stacks-blockchain-api/index.mdx b/content/docs/es/apis/stacks-blockchain-api/index.mdx
new file mode 100644
index 000000000..3511bf1ea
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/index.mdx
@@ -0,0 +1,35 @@
+---
+title: API de Blockchain de Stacks
+sidebarTitle: Visión general
+description: Datos de blockchain rápidos y confiables para el ecosistema Stacks a través de REST.
+llm: false
+---
+## Visión general
+
+La API de Stacks proporciona acceso completo a los datos de la blockchain de Stacks a través de una interfaz REST de alto rendimiento. Construida sobre respuestas en caché e indexación optimizada, entrega datos de transacciones, información de contratos inteligentes, saldos de cuentas y detalles de bloques con una latencia mínima.
+
+## Características principales
+
+* **Ingesta de datos en tiempo real** - Indexa continuamente la actividad de la cadena de bloques a medida que ocurre
+* **Respuestas en caché** - Rendimiento optimizado mediante estrategias de almacenamiento en caché inteligentes
+* **Acceso completo a los datos** - Historial de transacciones, contratos inteligentes, cuentas y bloques
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/extended' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/stacks-blockchain-api/usage).
+
+:::callout
+Todas las respuestas de la API de Stacks Blockchain incluyen [límites de tasa de encabezados](/resources/guides/response-headers) que te ayudan a monitorear el uso de tu API con información de cuota específica de Stacks.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de la Blockchain de Stacks?
+
+Contáctanos en el #api canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/stacks-blockchain-api/meta.json b/content/docs/es/apis/stacks-blockchain-api/meta.json
new file mode 100644
index 000000000..9f957b868
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/meta.json
@@ -0,0 +1,15 @@
+{
+ "title": "APIs",
+ "root": true,
+ "pages": [
+ "---Stacks Blockchain API---",
+ "index",
+ "usage",
+ "architecture",
+ "pagination",
+ "none-handling",
+ "requesting-proofs",
+ "---Reference---",
+ "...reference"
+ ]
+}
diff --git a/content/docs/es/apis/stacks-blockchain-api/nonce-handling.mdx b/content/docs/es/apis/stacks-blockchain-api/nonce-handling.mdx
new file mode 100644
index 000000000..9086da9f0
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/nonce-handling.mdx
@@ -0,0 +1,25 @@
+---
+title: Manejo de nonce
+description: Aprende cómo manejar nonces en Stacks.
+---
+Para evitar transacciones "atascadas", debes rastrear el próximo nonce disponible para los principales que emiten transacciones. La
+API de Stacks Blockchain proporciona un endpoint para simplificar el manejo de nonces al usar el siguiente comando:
+
+```terminal
+$ curl 'https://api.testnet.hiro.so/extended/v1/address//nonces'
+```
+
+```json
+{
+ "last_executed_tx_nonce": 5893,
+ "last_mempool_tx_nonce": null,
+ "possible_next_nonce": 5894,
+ "detected_missing_nonces": []
+}
+```
+
+El `possible_next_nonce` property es el nonce sugerido para la próxima transacción de un principal determinado. Se deriva como el siguiente número entero al nonce más grande encontrado en bloques y mempool. No tiene en cuenta los nonces faltantes.
+
+El `detected_missing_nonces` La propiedad encuentra cualquier nonce no contiguo después de inspeccionar las transacciones de los bloques y el mempool. Por ejemplo, para un principal dado, si la última transacción incluida en un bloque tiene un nonce de 5, y hay solo una transacción en el mempool con nonce 7, entonces indica que probablemente algo salió mal con la transacción con nonce 6 (ya sea que no fue creada o transmitida correctamente por un cliente, o fue descartada por cualquier razón). Esto es una fuerte indicación de que la transacción del mempool con nonce 7 nunca será minada ya que falta el nonce anterior.
+
+Los clientes que continúan transmitiendo transacciones con el `possible_next_nonce` propiedad de 8, luego 9, luego 10, probablemente resultará en que todas sus transacciones pendientes/en mempool nunca se procesen. Para que todas las transacciones se procesen, los clientes deben primero usar cualquier nonce faltante antes de usar el sugerido `possible_next_nonce`.
diff --git a/content/docs/es/apis/stacks-blockchain-api/pagination.mdx b/content/docs/es/apis/stacks-blockchain-api/pagination.mdx
new file mode 100644
index 000000000..f3bc0ffee
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/pagination.mdx
@@ -0,0 +1,53 @@
+---
+title: Paginación
+description: Aprende cómo paginar a través de listas.
+---
+## Uso
+
+Para hacer las respuestas de la API más compactas, las listas devueltas por la API están paginadas. Para las listas, el cuerpo de la respuesta incluye:
+
+* `limit`: El número de elementos de la lista devueltos por respuesta
+* `offset`: El número de elementos a omitir (comenzando desde 0)
+* `total`: El número de todos los elementos de lista disponibles
+* `results`: El array de elementos de la lista (la longitud del array es igual al límite establecido)
+
+Aquí hay una respuesta de ejemplo:
+
+```json
+{
+ "limit": 10,
+ "offset": 0,
+ "total": 101922,
+ "results": [
+ {
+ "tx_id": "0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0",
+ "nonce": 308,
+ "fee_rate": "0",
+ "sender_address": "ST39F7SA0AKH7RB363W3NE2DTHD3P32ZHNX2KE7J9",
+ "sponsored": false,
+ "post_condition_mode": "deny",
+ "post_conditions": [],
+ "anchor_mode": "on_chain_only",
+ "block_hash": "0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99",
+ "parent_block_hash": "0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6",
+ "block_height": 14461,
+ "burn_block_time": 1622875042,
+ "burn_block_time_iso": "2021-06-05T06:37:22.000Z",
+ "canonical": true,
+ "tx_index": 0,
+ "tx_status": "success",
+ "tx_result": {},
+ "microblock_hash": "",
+ "microblock_sequence": 2147483647,
+ "microblock_canonical": true,
+ "event_count": 0,
+ "events": [],
+ "tx_type": "coinbase",
+ "coinbase_payload": {}
+ },
+ {}
+ ]
+}
+```
+
+Usando el `limit` y `offset` propiedades, puede paginar a través de la lista completa aumentando el desplazamiento según el límite hasta alcanzar el total.
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/assets.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/assets.mdx
new file mode 100644
index 000000000..0c4db73bc
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/assets.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener activos de la cuenta
+sidebarTitle: Activos
+description: Recupera una lista de todos los eventos de activos asociados con una cuenta o un identificador de contrato.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/balances.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/balances.mdx
new file mode 100644
index 000000000..2bfcfb904
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/balances.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener saldos de cuenta
+sidebarTitle: Saldos
+description: Recupera información del saldo de la cuenta, incluyendo STX, tokens fungibles y no fungibles.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx
new file mode 100644
index 000000000..3029c1457
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transferencias entrantes de STX
+sidebarTitle: Transferencias entrantes de STX
+description: Obtiene una lista de transferencias de STX con memos al principal dado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/info.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/info.mdx
new file mode 100644
index 000000000..bed70c1f3
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/info.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información de la cuenta
+sidebarTitle: Información
+description: Recupera los datos de la cuenta para un identificador de cuenta o contrato dado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx
new file mode 100644
index 000000000..978615d53
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtén el último nonce
+sidebarTitle: Último nonce
+description: Recupera los últimos valores de nonce utilizados por una cuenta inspeccionando el mempool y las transacciones ancladas.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx
new file mode 100644
index 000000000..77709683a
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el saldo de STX de la cuenta
+sidebarTitle: Saldo de STX
+description: Obtiene el saldo de tokens STX para una dirección o identificador de contrato especificado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx
new file mode 100644
index 000000000..858d3ac6e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener detalles de transacciones de cuenta con transferencias
+sidebarTitle: Detalles de la transacción con transferencias
+description: Recupera los detalles de la transacción para una transacción específica, incluyendo las transferencias de STX para cada transacción.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx
new file mode 100644
index 000000000..298272cfd
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones de cuenta con transferencias
+sidebarTitle: Transacciones con transferencias
+description: Recupera transacciones para una cuenta específica incluyendo transferencias de STX para cada transacción.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions.mdx
new file mode 100644
index 000000000..0167dd0f5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/accounts/transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones de la cuenta
+sidebarTitle: Transacciones
+description: Recupera transacciones para una cuenta específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/average-times.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/average-times.mdx
new file mode 100644
index 000000000..7703fa801
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/average-times.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener tiempos promedio de bloque
+sidebarTitle: Tiempos promedio
+description: Recupera los tiempos promedio de bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx
new file mode 100644
index 000000000..e5002662e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque por hash de bloque de burnchain
+sidebarTitle: Bloque por hash de bloque quemado
+description: Recupera los detalles del bloque de un bloque específico para un hash de bloque de burnchain dado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx
new file mode 100644
index 000000000..250241336
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque por altura de bloque de burnchain
+sidebarTitle: Bloque por altura de bloque quemado
+description: Recupera los detalles del bloque de un bloque específico para una altura de bloque de burnchain dada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx
new file mode 100644
index 000000000..66bf45f0e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque por hash
+sidebarTitle: Bloque por hash
+description: Recupera los detalles del bloque de un bloque específico para una altura de cadena determinada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx
new file mode 100644
index 000000000..56f1a5c61
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx
@@ -0,0 +1,8 @@
+---
+title: Bloque por altura (v3)
+sidebarTitle: Bloque por altura (v3)
+description: Recupera un bloque por su altura utilizando el endpoint v3.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx
new file mode 100644
index 000000000..dc891708c
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque por altura
+sidebarTitle: Bloque por altura
+description: Recupera los detalles del bloque de un bloque específico para una altura de cadena determinada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx
new file mode 100644
index 000000000..b4842a9c0
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx
@@ -0,0 +1,8 @@
+---
+title: Validar bloque propuesto
+sidebarTitle: Propuesta de bloque
+description: Validar un bloque propuesto de Stacks.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-block.mdx
new file mode 100644
index 000000000..3408095b5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque
+sidebarTitle: Bloque
+description: Recupera un solo bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx
new file mode 100644
index 000000000..feb0ec225
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloques por bloque de quemado
+sidebarTitle: Bloques por bloque quemado
+description: Obtiene una lista de bloques confirmados por un bloque de quemado específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx
new file mode 100644
index 000000000..b878c7930
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloques
+sidebarTitle: Bloques
+description: Recupera una lista de bloques minados recientemente.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx
new file mode 100644
index 000000000..a7ca9d8a4
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloques recientes
+sidebarTitle: Bloques recientes
+description: Recupera una lista de bloques minados recientemente.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx
new file mode 100644
index 000000000..f1eca030a
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx
@@ -0,0 +1,8 @@
+---
+title: Bloque de carga
+sidebarTitle: Bloque de carga
+description: Subir un bloque al nodo.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx
new file mode 100644
index 000000000..de03ffa7f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloque de quemado
+sidebarTitle: Bloque de quemado
+description: Recupera un único bloque de quemado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx
new file mode 100644
index 000000000..8d4cfa274
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener bloques quemados
+sidebarTitle: Bloques de quemado
+description: Obtiene una lista de bloques de quemado recientes.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/faucets/stx.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/faucets/stx.mdx
new file mode 100644
index 000000000..5e4f21779
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/faucets/stx.mdx
@@ -0,0 +1,7 @@
+---
+title: Tokens de la red de prueba STX
+sidebarTitle: STX
+description: Entrega tokens STX de testnet a una dirección especificada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/fees/estimate.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/fees/estimate.mdx
new file mode 100644
index 000000000..cce4d5846
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/fees/estimate.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener tarifas aproximadas para la transacción dada
+sidebarTitle: Estimación
+description: Obtén una tarifa estimada para la transacción proporcionada.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx
new file mode 100644
index 000000000..b353397c0
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener tasa de comisión
+sidebarTitle: Tasa de comisión
+description: Recupera una tasa de comisión estimada para las transacciones.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx
new file mode 100644
index 000000000..4114d6254
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener estimación de tarifa de transferencia
+sidebarTitle: Estimación de transferencia
+description: Obtiene una tasa de comisión estimada para transacciones de transferencia de STX.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx
new file mode 100644
index 000000000..8c554438a
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el suministro circulante de STX en formato de texto plano
+sidebarTitle: Suministro circulante de STX en formato de texto plano
+description: Recupera el suministro circulante de STX como texto sin formato.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/core-api.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/core-api.mdx
new file mode 100644
index 000000000..4702899f2
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/core-api.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información básica de la API
+sidebarTitle: Información de la API principal
+description: Recupera información sobre la API Core, incluyendo la versión del servidor.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/health.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/health.mdx
new file mode 100644
index 000000000..eb48dcb9f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/health.mdx
@@ -0,0 +1,8 @@
+---
+title: Chequeo de salud
+sidebarTitle: Salud
+description: Obtener información de salud sobre el estado de sincronización del nodo.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx
new file mode 100644
index 000000000..1ac1b86c6
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el suministro total y desbloqueado de STX (heredado)
+sidebarTitle: Suministro total y desbloqueado de STX (heredado)
+description: Recupera el suministro total y desbloqueado de STX en el formato heredado de la API 1.0.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/network-block-time.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/network-block-time.mdx
new file mode 100644
index 000000000..6e567a7ed
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/network-block-time.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el tiempo objetivo de bloque de la red
+sidebarTitle: El tiempo objetivo de bloque de la red
+description: Recupera los tiempos de bloque objetivo para la red principal y la red de pruebas.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx
new file mode 100644
index 000000000..3988258b6
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el tiempo objetivo de bloque de una red determinada
+sidebarTitle: El tiempo objetivo de bloque de una red determinada
+description: Recupera el tiempo de bloque objetivo para una red determinada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/status.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/status.mdx
new file mode 100644
index 000000000..b9fd8a690
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener estado de la API
+sidebarTitle: Estado de la API
+description: Recupera el estado de ejecución de la API de Blockchain de Stacks.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx
new file mode 100644
index 000000000..9945f4630
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el suministro total y desbloqueado de STX
+sidebarTitle: Suministro total y desbloqueado de STX
+description: Obtiene el suministro total y desbloqueado de STX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx
new file mode 100644
index 000000000..ac757272e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el suministro total de STX en formato de texto plano
+sidebarTitle: Suministro total de STX en formato de texto sin formato
+description: Obtiene el suministro total de STX como texto sin formato.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx
new file mode 100644
index 000000000..f7b50027f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener prioridades de tarifas de transacción
+sidebarTitle: Prioridades de las comisiones de transacción
+description: Recupera las prioridades de tarifas estimadas (en micro-STX) para todas las transacciones que se encuentran actualmente en el mempool. También devuelve las prioridades separadas por tipo de transacción.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx
new file mode 100644
index 000000000..c3ade4fd0
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener bloque Nakamoto
+sidebarTitle: Bloque de Nakamoto
+description: Obtén un bloque Nakamoto por su hash de índice de bloque.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx
new file mode 100644
index 000000000..5f86a6db8
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener bloques de tenencia de Nakamoto
+sidebarTitle: Bloques de mandato de Nakamoto
+description: Obtener una secuencia de bloques Nakamoto en un período.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx
new file mode 100644
index 000000000..1bc2afb31
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx
@@ -0,0 +1,8 @@
+---
+title: Información sobre la bifurcación de tenencia
+sidebarTitle: Información sobre la bifurcación de tenencia
+description: Obtén información sobre las bifurcaciones de tenencia entre dos IDs de bloque.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx
new file mode 100644
index 000000000..163a1abd6
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener metadatos de tenencia de Nakamoto
+sidebarTitle: Metadatos de permanencia de Nakamoto
+description: Obtener metadatos sobre el mandato actual de Nakamoto.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx
new file mode 100644
index 000000000..ddea5480f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx
@@ -0,0 +1,8 @@
+---
+title: Consejo para la titularidad
+sidebarTitle: Consejo para la titularidad
+description: Obtén el ID del bloque de propina de la tenencia asociada a un hash de consenso dado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx
new file mode 100644
index 000000000..1f8365519
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener archivo de zona histórico
+sidebarTitle: Zona de archivo histórico
+description: Recupera el archivo de zona histórico para un nombre específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/name-details.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-details.mdx
new file mode 100644
index 000000000..225dce5ea
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-details.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener detalles del nombre
+sidebarTitle: Detalles del nombre
+description: Recupera detalles de un nombre dado, incluyendo la dirección, el estado y el ID de la última transacción.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx
new file mode 100644
index 000000000..15d9a75cb
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener subdominios de nombre
+sidebarTitle: Nombrar subdominios
+description: Recupera la lista de subdominios para un nombre específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx
new file mode 100644
index 000000000..05675ab54
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener archivo de zona de nombre
+sidebarTitle: Nombrar archivo de zona
+description: Recupera el archivo de zona para un nombre específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/names.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/names.mdx
new file mode 100644
index 000000000..25b2b14cc
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/names.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener todos los nombres
+sidebarTitle: Todos los nombres
+description: Recupera una lista de todos los nombres conocidos por el nodo.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/namespace-names.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/namespace-names.mdx
new file mode 100644
index 000000000..feacbaba8
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/namespace-names.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener nombres de espacios de nombres
+sidebarTitle: Nombres de espacios de nombres
+description: Recupera una lista de nombres dentro de un espacio de nombres determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/namespaces.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/namespaces.mdx
new file mode 100644
index 000000000..ac5df3d16
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/namespaces.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener todos los espacios de nombres
+sidebarTitle: Todos los espacios de nombres
+description: Recupera una lista de todos los espacios de nombres conocidos por el nodo.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx
new file mode 100644
index 000000000..f9b58da18
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener nombres propiedad de una dirección
+sidebarTitle: Nombres propiedad de la dirección
+description: Recupera la lista de nombres que pertenecen a una dirección específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx
new file mode 100644
index 000000000..607615494
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener historial de token no fungible
+sidebarTitle: Historia de los tokens no fungibles
+description: Recupera el historial de un token no fungible.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx
new file mode 100644
index 000000000..f3434ebd0
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener tenencias de tokens no fungibles
+sidebarTitle: Tenencias de tokens no fungibles
+description: Recupera una lista de tokens no fungibles propiedad del principal dado (dirección STX o ID de contrato inteligente).
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx
new file mode 100644
index 000000000..2f333beb5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener acuñaciones de tokens no fungibles
+sidebarTitle: Acuñaciones de tokens no fungibles
+description: Recupera una lista de acuñaciones de tokens no fungibles para un identificador de activo dado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx
new file mode 100644
index 000000000..9227f0622
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener ciclo PoX
+sidebarTitle: Ciclo de PoX
+description: Obtiene detalles de un ciclo PoX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx
new file mode 100644
index 000000000..a2e4fefcb
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener ciclos de PoX
+sidebarTitle: Ciclos de PoX
+description: Obtiene una lista de ciclos PoX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx
new file mode 100644
index 000000000..8b959a74d
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener detalles de PoX
+sidebarTitle: Detalles de PoX
+description: Recupera información de Prueba de Transferencia (PoX).
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx
new file mode 100644
index 000000000..d1a7a241f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx
@@ -0,0 +1,8 @@
+---
+title: Detalles del firmante
+sidebarTitle: Detalles del firmante
+description: Obtener información del firmante para un firmante y ciclo específicos.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx
new file mode 100644
index 000000000..27f5d6a99
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener firmante en ciclo PoX
+sidebarTitle: Firmante en el ciclo PoX
+description: Obtiene detalles de un firmante en un ciclo PoX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx
new file mode 100644
index 000000000..cacbe9fef
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener firmantes en el ciclo PoX
+sidebarTitle: Firmantes en el ciclo PoX
+description: Obtiene una lista de firmantes en un ciclo PoX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx
new file mode 100644
index 000000000..cd7d78a9c
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información del conjunto de apiladores y firmantes
+sidebarTitle: Información del conjunto de apiladores y firmantes
+description: Recupera información del conjunto de apiladores y firmantes para un ciclo determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx
new file mode 100644
index 000000000..6555a2203
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener stackers para el firmante en el ciclo PoX
+sidebarTitle: Apiladores para firmante en ciclo PoX
+description: Obtiene una lista de stackers para un firmante en un ciclo PoX.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/search/search-by-id.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/search/search-by-id.mdx
new file mode 100644
index 000000000..e36973db6
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/search/search-by-id.mdx
@@ -0,0 +1,7 @@
+---
+title: Buscar por ID
+sidebarTitle: Buscar por ID
+description: Buscar bloques, transacciones, contratos o cuentas por hash/ID.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx
new file mode 100644
index 000000000..1c046011e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener contratos por característica
+sidebarTitle: Contratos por rasgo
+description: "Recupera una lista de contratos basada en las siguientes características enumeradas en formato JSON: funciones, variables, mapas, tokens fungibles y tokens no fungibles."
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx
new file mode 100644
index 000000000..221ac42e5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener valor constante
+sidebarTitle: Valor constante
+description: Obtener el valor de una constante dentro de un contrato.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx
new file mode 100644
index 000000000..967b449fe
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener eventos del contrato
+sidebarTitle: Eventos de contrato
+description: Recupera una lista de eventos que han sido desencadenados por un contrato inteligente determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx
new file mode 100644
index 000000000..8f23f2613
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx
@@ -0,0 +1,8 @@
+---
+title: Llamada rápida a función de solo lectura
+sidebarTitle: Llamada rápida de solo lectura
+description: Llama a una función de solo lectura en un contrato inteligente sin costo ni seguimiento de memoria para una ejecución más rápida.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx
new file mode 100644
index 000000000..4e9c5b149
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener información del contrato
+sidebarTitle: Información del contrato
+description: Recupera detalles de un contrato inteligente específico.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx
new file mode 100644
index 000000000..dcceba6d5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener interfaz del contrato
+sidebarTitle: Interfaz del contrato
+description: Recupera una lista de funciones, variables, mapas, tokens fungibles y tokens no fungibles para un contrato inteligente determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx
new file mode 100644
index 000000000..c61af6e28
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener entrada del mapa de contrato
+sidebarTitle: Entrada del mapa de contrato
+description: Recupera una entrada específica de un mapa de datos de contrato.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx
new file mode 100644
index 000000000..e2ea6c223
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx
@@ -0,0 +1,8 @@
+---
+title: Llamar función de solo lectura
+sidebarTitle: Llamar función de solo lectura
+description: Llama a una función pública de solo lectura en un contrato inteligente determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx
new file mode 100644
index 000000000..384e10337
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener el código fuente del contrato
+sidebarTitle: Fuente del contrato
+description: Recupera el código fuente de Clarity de un contrato determinado, junto con la altura del bloque en el que se publicó y la prueba MARF de los datos.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx
new file mode 100644
index 000000000..b36e3977f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener el estado de los contratos
+sidebarTitle: Estado de los contratos
+description: Recupera el estado de implementación de múltiples contratos inteligentes.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx
new file mode 100644
index 000000000..f938c33e2
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener detalles de implementación de rasgos
+sidebarTitle: Detalles de implementación de rasgos
+description: Determinar si un rasgo especificado está implementado (ya sea explícita o implícitamente) dentro de un contrato dado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx
new file mode 100644
index 000000000..b205d5fdf
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener variable de datos
+sidebarTitle: Valor de la variable de datos
+description: Obtener variable de datos del contrato
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx
new file mode 100644
index 000000000..0d86109fc
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener sorteos
+sidebarTitle: Obtener sorteos
+description: Recupera información sobre sorteos de la burnchain.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx
new file mode 100644
index 000000000..a13b17719
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx
@@ -0,0 +1,8 @@
+---
+title: Últimos y finales sorteos
+sidebarTitle: Últimos y finales sorteos
+description: Recupera información sobre los últimos y más recientes sorteos.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx
new file mode 100644
index 000000000..453485cb5
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por hash de quemado
+sidebarTitle: Sorteo por hash de quemado
+description: Obtiene información sobre un sorteo por su hash de bloque de quemado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx
new file mode 100644
index 000000000..00d3b02fa
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por altura de quemado
+sidebarTitle: Sorteo por altura de quemado
+description: Obtiene información sobre un sorteo por su altura de bloque de quemado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx
new file mode 100644
index 000000000..6c44be0a2
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por hash de consenso
+sidebarTitle: Sorteo por hash de consenso
+description: Recupera información sobre un sorteo por su hash de consenso.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx
new file mode 100644
index 000000000..941fc23eb
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener miembros del grupo de staking
+sidebarTitle: Miembros del grupo de staking
+description: Obtiene la lista de miembros del grupo de apilamiento para un delegador principal determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx
new file mode 100644
index 000000000..0adcd9e2b
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener recompensa reciente de burnchain para el destinatario dado
+sidebarTitle: Recompensa reciente de la cadena de quemado para el destinatario dado
+description: Recupera una lista de recompensas recientes de la cadena de quemado (por ejemplo, Bitcoin) para el destinatario especificado con las cantidades asociadas y la información del bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx
new file mode 100644
index 000000000..5efa5ae5f
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener destinatarios recientes de recompensas de burnchain
+sidebarTitle: Destinatarios recientes de recompensas de burnchain
+description: Recupera una lista de los destinatarios recientes de recompensas de la cadena de quemado (por ejemplo, Bitcoin) con las cantidades asociadas y la información del bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx
new file mode 100644
index 000000000..4aa6d89a7
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener entradas recientes de titulares de espacios de recompensa
+sidebarTitle: Entradas recientes de titulares de espacios de recompensa
+description: Recupera una lista de las direcciones de Bitcoin que recibirían válidamente compromisos de Prueba de Transferencia para una dirección de destinatario titular de un espacio de recompensa determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx
new file mode 100644
index 000000000..d82a5e345
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener titulares de slots de recompensa recientes
+sidebarTitle: Titulares recientes de espacios de recompensa
+description: Recupera una lista de las direcciones de Bitcoin que recibirían válidamente compromisos de Prueba de Transferencia.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx
new file mode 100644
index 000000000..9e3bd6d37
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener las recompensas totales de burnchain para el destinatario especificado
+sidebarTitle: Recompensas totales de burnchain para el destinatario dado
+description: Recupera las recompensas totales de la cadena de quemado (por ejemplo, Bitcoin) para una dirección de destinatario determinada.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/tokens/holders.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/tokens/holders.mdx
new file mode 100644
index 000000000..f93421fe3
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/tokens/holders.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener titulares de tokens fungibles
+sidebarTitle: Titulares de tokens fungibles
+description: Recupera la lista de titulares de tokens fungibles para un ID de token determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx
new file mode 100644
index 000000000..2b5ad4559
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones de dirección
+sidebarTitle: Direcciones de transacciones
+description: Recupera transacciones enviadas o recibidas por una dirección STX o ID de contrato inteligente.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx
new file mode 100644
index 000000000..7d8eb06dc
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx
@@ -0,0 +1,8 @@
+---
+title: Transmitir transacción
+sidebarTitle: Transacción
+description: Transmite transacciones sin procesar en la red.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx
new file mode 100644
index 000000000..ef481d203
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener detalles de las transacciones
+sidebarTitle: Detalles de las transacciones
+description: Recupera detalles para una lista de transacciones.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx
new file mode 100644
index 000000000..aa83a6b46
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener eventos para una transacción de dirección
+sidebarTitle: Eventos para una transacción de dirección
+description: Recupera eventos para una transacción específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx
new file mode 100644
index 000000000..1569f8b10
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacción sin procesar
+sidebarTitle: Transacción sin procesar
+description: Recupera una transacción serializada codificada en hexadecimal para un ID determinado.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx
new file mode 100644
index 000000000..711762fe1
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacción
+sidebarTitle: Transacción
+description: Recupera detalles de una transacción específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx
new file mode 100644
index 000000000..fe54b0c87
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones de mempool
+sidebarTitle: Transacciones en la mempool
+description: Recupera todas las transacciones que han sido recientemente transmitidas al mempool. Estas son transacciones pendientes esperando confirmación.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx
new file mode 100644
index 000000000..b3f0b3636
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones recientes
+sidebarTitle: Transacciones recientes
+description: Recupera todas las transacciones minadas recientemente.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx
new file mode 100644
index 000000000..781be0463
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener estadísticas de las transacciones en mempool
+sidebarTitle: Estadísticas de transacciones en mempool
+description: Recupera estadísticas de las transacciones en el mempool, como recuentos, antigüedad y tarifas.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx
new file mode 100644
index 000000000..41aaa0b6e
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx
@@ -0,0 +1,8 @@
+---
+title: Detalles de la transacción (v3)
+sidebarTitle: Detalles de la transacción (v3)
+description: Obtén detalles de la transacción por ID de transacción utilizando el endpoint v3.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx
new file mode 100644
index 000000000..033ffabdc
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener eventos de transacción
+sidebarTitle: Eventos de transacción
+description: Recupera eventos para una transacción específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx
new file mode 100644
index 000000000..8128050ef
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones por bloque
+sidebarTitle: Transacciones por bloque
+description: Recupera las transacciones confirmadas en un solo bloque.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx
new file mode 100644
index 000000000..de4d075e7
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener transacciones para dirección
+sidebarTitle: Transacciones para dirección
+description: Recupera transacciones para una dirección específica.
+full: true
+---
+
diff --git a/content/docs/es/apis/stacks-blockchain-api/requesting-proofs.mdx b/content/docs/es/apis/stacks-blockchain-api/requesting-proofs.mdx
new file mode 100644
index 000000000..3af495251
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/requesting-proofs.mdx
@@ -0,0 +1,11 @@
+---
+title: Solicitando pruebas
+description: Comprender las solicitudes de prueba de los puntos finales de la API.
+---
+## Visión general
+
+Varios endpoints solicitarán el [Prueba de Merkel MARF](https://github.com/stacksgov/sips/blob/main/sips/sip-004/sip-004-materialized-view.md#marf-merkle-proofs) por defecto.
+
+Provisto con la prueba, un cliente puede verificar el valor, la energía acumulada gastada y el número de confirmaciones para el valor de respuesta proporcionado por la API.
+
+Solicitar la prueba requiere más recursos (tiempo de cómputo, tiempo de respuesta y tamaño del cuerpo de la respuesta). Para evitar los recursos adicionales, en caso de que no se requiera verificación, los puntos finales de la API permiten establecer el parámetro de solicitud: `proof=0`. El objeto de respuesta devuelto no tendrá ningún campo de prueba.
diff --git a/content/docs/es/apis/stacks-blockchain-api/usage.mdx b/content/docs/es/apis/stacks-blockchain-api/usage.mdx
new file mode 100644
index 000000000..8be649b94
--- /dev/null
+++ b/content/docs/es/apis/stacks-blockchain-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de la cadena de bloques de Stacks.
+---
+## Uso
+
+La API de Stacks está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de Stacks, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.hiro.so/extended' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Si estás utilizando una api-key, reemplaza `$HIRO_API_KEY` con tu clave API secreta.
+
+```terminal
+$ curl -L 'https://api.hiro.so/extended' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Códigos de respuesta
+
+La API de Stacks utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de una solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Compruebe que los parámetros fueron correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave de API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/apis/stacks-node-rpc-api/index.mdx b/content/docs/es/apis/stacks-node-rpc-api/index.mdx
new file mode 100644
index 000000000..d047172bf
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/index.mdx
@@ -0,0 +1,28 @@
+---
+title: API RPC del Nodo Stacks
+sidebarTitle: Visión general
+description: Acceso RPC directo a los nodos de la cadena de bloques Stacks para datos y operaciones en tiempo real.
+llm: false
+---
+## Visión general
+
+La API RPC del Nodo Stacks proporciona acceso directo a los nodos de la cadena de bloques Stacks a través de puntos finales RPC. **Hiro envía estas llamadas a nodos Stacks ascendentes** - no mantenemos ni controlamos los nodos en sí, por lo que el rendimiento y la disponibilidad dependen de la infraestructura blockchain subyacente.
+
+## Características principales
+
+* **Métodos de nodo blockchain sin procesar** - Enviar transacciones, llamar contratos de solo lectura, consultar mempool/estado
+* **Estado de la blockchain en tiempo real** - Sin capas de almacenamiento en caché, respuestas directas del nodo
+* **Ejecución de contratos inteligentes** - Ejecutar funciones de solo lectura y recuperar el estado del contrato
+* **Transmisión de transacciones** - Enviar transacciones directamente a la red
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' -H 'Accept: application/json'
+```
+
+Para obtener más ejemplos de uso e información sobre límites de velocidad, consulte [Uso](/apis/stacks-node-rpc-api/usage).
+
+:::callout
+**REST vs RPC:** Usar [API de la Blockchain Stacks](/apis/stacks-blockchain-api) para datos de blockchain almacenados en caché e indexados (saldos, transacciones, eventos). Utilice los puntos finales RPC para operaciones de nodo sin procesar y consultas de estado de blockchain en tiempo real.
+:::
diff --git a/content/docs/es/apis/stacks-node-rpc-api/meta.json b/content/docs/es/apis/stacks-node-rpc-api/meta.json
new file mode 100644
index 000000000..4c84cf1fc
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "APIs",
+ "root": true,
+ "pages": ["---Stacks Node RPC API---", "index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/accounts/info.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/accounts/info.mdx
new file mode 100644
index 000000000..6b3a1f567
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/accounts/info.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información de la cuenta
+sidebarTitle: Información
+description: Recupera los datos de la cuenta para un identificador de cuenta o contrato determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx
new file mode 100644
index 000000000..56f1a5c61
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx
@@ -0,0 +1,8 @@
+---
+title: Bloque por altura (v3)
+sidebarTitle: Bloque por altura (v3)
+description: Recupera un bloque por su altura utilizando el endpoint v3.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx
new file mode 100644
index 000000000..b4842a9c0
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx
@@ -0,0 +1,8 @@
+---
+title: Validar bloque propuesto
+sidebarTitle: Propuesta de bloque
+description: Validar un bloque propuesto de Stacks.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx
new file mode 100644
index 000000000..35a52ac71
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx
@@ -0,0 +1,8 @@
+---
+title: Subir bloque
+sidebarTitle: Subir bloque
+description: Subir un bloque al nodo.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/fees/estimate.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/fees/estimate.mdx
new file mode 100644
index 000000000..cce4d5846
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/fees/estimate.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener tarifas aproximadas para la transacción dada
+sidebarTitle: Estimación
+description: Obtén una tarifa estimada para la transacción proporcionada.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx
new file mode 100644
index 000000000..fba5eec10
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener estimación de tarifa de transferencia
+sidebarTitle: Estimación de transferencia
+description: Recupera una tasa de comisión estimada para las transacciones de transferencia de STX.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/info/core-api.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/info/core-api.mdx
new file mode 100644
index 000000000..4702899f2
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/info/core-api.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información básica de la API
+sidebarTitle: Información de la API principal
+description: Recupera información sobre la API Core, incluyendo la versión del servidor.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/info/health.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/info/health.mdx
new file mode 100644
index 000000000..eb48dcb9f
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/info/health.mdx
@@ -0,0 +1,8 @@
+---
+title: Chequeo de salud
+sidebarTitle: Salud
+description: Obtener información de salud sobre el estado de sincronización del nodo.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx
new file mode 100644
index 000000000..9d1e1000c
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener bloque Nakamoto
+sidebarTitle: Bloque Nakamoto
+description: Obtener un bloque Nakamoto por su hash de bloque de índice.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx
new file mode 100644
index 000000000..2ce817cfa
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener bloques de tenencia de Nakamoto
+sidebarTitle: Bloques de tenencia de Nakamoto
+description: Obtener una secuencia de bloques Nakamoto en un mandato.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx
new file mode 100644
index 000000000..1ab7c4e90
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx
@@ -0,0 +1,8 @@
+---
+title: Información sobre la bifurcación de tenencia
+sidebarTitle: Información sobre la bifurcación de tenencia
+description: Obtener información sobre las bifurcaciones de tenencia entre dos ID de bloque.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx
new file mode 100644
index 000000000..7eb5ef2e4
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener metadatos de tenencia de Nakamoto
+sidebarTitle: Metadatos de tenencia de Nakamoto
+description: Obtener metadatos sobre la tenencia de Nakamoto en curso.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx
new file mode 100644
index 000000000..2af5aa961
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx
@@ -0,0 +1,8 @@
+---
+title: Consejo de permanencia
+sidebarTitle: Consejo de permanencia
+description: Obtén el ID del bloque de propina de la tenencia asociada con un hash de consenso dado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx
new file mode 100644
index 000000000..d4dfe2ac6
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener detalles de PoX
+sidebarTitle: Detalles de PoX
+description: Recupera información de Proof-of-Transfer (PoX).
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx
new file mode 100644
index 000000000..d1a7a241f
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx
@@ -0,0 +1,8 @@
+---
+title: Detalles del firmante
+sidebarTitle: Detalles del firmante
+description: Obtener información del firmante para un firmante y ciclo específicos.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx
new file mode 100644
index 000000000..bc1b7d6e4
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener información del conjunto de apiladores y firmantes
+sidebarTitle: Información del conjunto de apiladores y firmantes
+description: Recupera información del conjunto de stackers y firmantes para un ciclo determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx
new file mode 100644
index 000000000..221ac42e5
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener valor constante
+sidebarTitle: Valor constante
+description: Obtener el valor de una constante dentro de un contrato.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx
new file mode 100644
index 000000000..eae6ec942
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx
@@ -0,0 +1,8 @@
+---
+title: Llamada rápida a función de solo lectura
+sidebarTitle: Llamada rápida de solo lectura
+description: Llama a una función de solo lectura en un contrato inteligente sin seguimiento de costos y memoria para una ejecución más rápida.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx
new file mode 100644
index 000000000..f9eced13d
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener interfaz del contrato
+sidebarTitle: Interfaz de contrato
+description: Obtiene una lista de funciones, variables, mapas, tokens fungibles y tokens no fungibles para un contrato inteligente determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx
new file mode 100644
index 000000000..20dedf9fc
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener entrada del mapa del contrato
+sidebarTitle: Entrada de mapa de contrato
+description: Recupera una entrada específica del mapa de datos de un contrato.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx
new file mode 100644
index 000000000..e2ea6c223
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx
@@ -0,0 +1,8 @@
+---
+title: Llamar función de solo lectura
+sidebarTitle: Llamar función de solo lectura
+description: Llama a una función pública de solo lectura en un contrato inteligente determinado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx
new file mode 100644
index 000000000..355abf67b
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener código fuente del contrato
+sidebarTitle: Fuente del contrato
+description: Recupera el código fuente de Clarity de un contrato determinado, junto con la altura del bloque en el que se publicó y la prueba MARF de los datos.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx
new file mode 100644
index 000000000..daa0255f9
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener detalles de implementación de rasgos
+sidebarTitle: Detalles de implementación de rasgos
+description: Determinar si un rasgo específico está implementado (ya sea explícita o implícitamente) dentro de un contrato dado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx
new file mode 100644
index 000000000..78c28f049
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener variable de datos
+sidebarTitle: Valor de variable de datos
+description: Obtener variable de datos del contrato
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx
new file mode 100644
index 000000000..75520fd08
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx
@@ -0,0 +1,8 @@
+---
+title: Obtener sorticiones
+sidebarTitle: Obtener sorteos
+description: Recupera información sobre sorteos de la burnchain.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx
new file mode 100644
index 000000000..8600bb2e4
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx
@@ -0,0 +1,8 @@
+---
+title: Últimas y finales sorticiones
+sidebarTitle: Últimas y finales sorticiones
+description: Recupera información sobre las últimas y más recientes sorticiones.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx
new file mode 100644
index 000000000..2a94f3ec3
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por hash de quemado
+sidebarTitle: Sorteo por hash de quemado
+description: Recupera información sobre un sorteo por su hash de bloque de quemado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx
new file mode 100644
index 000000000..884ea2145
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por altura de quemado
+sidebarTitle: Sorteo por altura de quemado
+description: Obtiene información sobre un sorteo por la altura de su bloque de quemado.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx
new file mode 100644
index 000000000..6c44be0a2
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx
@@ -0,0 +1,8 @@
+---
+title: Sorteo por hash de consenso
+sidebarTitle: Sorteo por hash de consenso
+description: Recupera información sobre un sorteo por su hash de consenso.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx
new file mode 100644
index 000000000..7d8eb06dc
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx
@@ -0,0 +1,8 @@
+---
+title: Transmitir transacción
+sidebarTitle: Transacción
+description: Transmite transacciones sin procesar en la red.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx b/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx
new file mode 100644
index 000000000..41aaa0b6e
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx
@@ -0,0 +1,8 @@
+---
+title: Detalles de la transacción (v3)
+sidebarTitle: Detalles de la transacción (v3)
+description: Obtén detalles de la transacción por ID de transacción utilizando el endpoint v3.
+full: true
+isRpc: true
+---
+
diff --git a/content/docs/es/apis/stacks-node-rpc-api/usage.mdx b/content/docs/es/apis/stacks-node-rpc-api/usage.mdx
new file mode 100644
index 000000000..d664eee3c
--- /dev/null
+++ b/content/docs/es/apis/stacks-node-rpc-api/usage.mdx
@@ -0,0 +1,65 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API RPC del Nodo Stacks.
+---
+## Uso
+
+The Stacks Node RPC API provides direct access to Stacks blockchain nodes through RPC endpoints. All requests use HTTPS and enforce standard REST principles.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Incluya su clave API para límites de tasa más altos:
+
+```terminal
+$ curl -L 'https://api.hiro.so/v2/info' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Límites de tasa
+
+Las llamadas RPC son **ponderado según el costo del método** and consume more units than REST endpoints:
+
+| Tipo de método | Ejemplos | Multiplicador de costo |
+|-------------|----------|-----------------|
+| Lecturas ligeras | `get_block`, `get_transaction` | 1× |
+| Llamadas a contratos de solo lectura | `call_read_only_function` | 2× |
+| Envío de transacción | `submit_transaction` | 3× |
+| Operaciones pesadas | `trace_call`, escaneos profundos de contratos | 5× |
+
+### Encabezados de límite de tasa
+
+```
+X-RateLimit-Limit: 900 # window capacity in units
+X-RateLimit-Remaining: 125 # remaining units
+X-RateLimit-Reset: 60 # seconds until reset
+X-RateLimit-Method-Cost: 3 # cost for this RPC method
+X-Plan-Tier: starter # your plan tier
+X-Surface: rpc # indicates RPC endpoint
+```
+
+## Códigos de respuesta
+
+| Código | Descripción |
+|------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Parámetros inválidos |
+| `401` | Falta la clave API |
+| `403` | Clave de API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de velocidad excedido |
+| `5xx` | Errores del servidor/nodo ascendente |
diff --git a/content/docs/es/apis/token-metadata-api/index.mdx b/content/docs/es/apis/token-metadata-api/index.mdx
new file mode 100644
index 000000000..e6897dc7b
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/index.mdx
@@ -0,0 +1,35 @@
+---
+title: API de Metadatos de Tokens
+sidebarTitle: Visión general
+description: Metadatos rápidos y confiables para tokens de Stacks a través de REST.
+llm: false
+---
+## Visión general
+
+La API de Metadatos de Tokens proporciona metadatos completos para tokens en la blockchain de Stacks a través de una interfaz REST de alto rendimiento. Construida con respuestas en caché e indexación optimizada, ofrece información de tokens fungibles, propiedades de NFT y datos de colecciones con una latencia mínima.
+
+## Características principales
+
+* **Cobertura completa de tokens** - Metadatos para tokens fungibles, no fungibles y semi-fungibles
+* **Respuestas en caché** - Rendimiento optimizado mediante estrategias de almacenamiento en caché inteligentes
+* **Metadatos enriquecidos** - Propiedades de tokens, atributos e información de colección
+
+## Uso
+
+```terminal
+$ curl -L 'https://api.hiro.so/metadata/v1/ft' -H 'Accept: application/json'
+```
+
+Para más ejemplos de uso, haga clic [aquí](/apis/token-metadata-api/usage).
+
+:::callout
+Todas las respuestas de la API de metadatos de tokens incluyen [límites de tasa de encabezados](/resources/guides/response-headers) que te ayudan a monitorear el uso de tu API con información de cuota específica de Stacks.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con la API de Metadatos de Tokens?
+
+Contáctanos en el #api canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horas de oficina semanales](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/apis/token-metadata-api/meta.json b/content/docs/es/apis/token-metadata-api/meta.json
new file mode 100644
index 000000000..1fae121a6
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Token Metadata API",
+ "root": true,
+ "pages": ["index", "usage", "---Reference---", "...reference"]
+}
diff --git a/content/docs/es/apis/token-metadata-api/reference/info/index.mdx b/content/docs/es/apis/token-metadata-api/reference/info/index.mdx
new file mode 100644
index 000000000..c8532742d
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/info/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Información
+index: true
+full: true
+description: Recupera información sobre la API de Metadatos de Token, incluyendo la versión del servidor.
+---
diff --git a/content/docs/es/apis/token-metadata-api/reference/info/status.mdx b/content/docs/es/apis/token-metadata-api/reference/info/status.mdx
new file mode 100644
index 000000000..1da45235d
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/info/status.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener estado
+sidebarTitle: Estado
+description: Recupera información sobre la API de Metadatos de Token, incluyendo la versión del servidor.
+full: true
+---
+
diff --git a/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx b/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx
new file mode 100644
index 000000000..5f7b566ab
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener metadatos de token fungible
+sidebarTitle: Metadatos de token fungible
+description: Recupera metadatos para un token fungible SIP-010.
+full: true
+---
+
diff --git a/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx b/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx
new file mode 100644
index 000000000..3138dcd99
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener tokens fungibles
+sidebarTitle: Tokens fungibles
+description: Recupera información sobre tokens fungibles.
+full: true
+---
+
diff --git a/content/docs/es/apis/token-metadata-api/reference/tokens/index.mdx b/content/docs/es/apis/token-metadata-api/reference/tokens/index.mdx
new file mode 100644
index 000000000..603f061ff
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/tokens/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Tokens
+index: true
+full: true
+description: Recupera información sobre tokens en la cadena de bloques de Stacks.
+---
diff --git a/content/docs/es/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx b/content/docs/es/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx
new file mode 100644
index 000000000..f917651a0
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener metadatos de token no fungible
+sidebarTitle: Metadatos de token no fungible
+description: Recupera metadatos para un token no fungible SIP-009.
+full: true
+---
+
diff --git a/content/docs/es/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx b/content/docs/es/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx
new file mode 100644
index 000000000..c8d0e2384
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx
@@ -0,0 +1,7 @@
+---
+title: Obtener metadatos de token semi-fungible
+sidebarTitle: Metadatos de token semi-fungible
+description: Recupera información sobre tokens semi-fungibles.
+full: true
+---
+
diff --git a/content/docs/es/apis/token-metadata-api/usage.mdx b/content/docs/es/apis/token-metadata-api/usage.mdx
new file mode 100644
index 000000000..f708ad8a8
--- /dev/null
+++ b/content/docs/es/apis/token-metadata-api/usage.mdx
@@ -0,0 +1,47 @@
+---
+title: Uso básico
+sidebarTitle: Uso
+description: Aprende los conceptos básicos del uso de la API de Metadatos de Token.
+---
+## Uso
+
+La API de Metadatos de Tokens está construida sobre principios REST, imponiendo HTTPS para todas las solicitudes para garantizar la seguridad, integridad y privacidad de los datos.
+
+### URL base
+
+```console -c
+https://api.hiro.so
+```
+
+### Realizando solicitudes
+
+Para hacer una solicitud a la API de Metadatos de Token, puedes pegar el comando curl a continuación en tu terminal.
+
+```terminal
+$ curl -L 'https://api.hiro.so/metadata/v1/ft' \
+ -H 'Accept: application/json'
+```
+
+### Autenticación
+
+Si estás utilizando una api-key, reemplaza `$HIRO_API_KEY` con tu clave API secreta.
+
+```terminal
+$ curl -L 'https://api.hiro.so/metadata/v1/ft' \
+ -H 'Accept: application/json' \
+ -H 'x-api-key: $HIRO_API_KEY'
+```
+
+## Códigos de respuesta
+
+La API de Metadatos de Tokens utiliza códigos de respuesta HTTP estándar para indicar el éxito o fracaso de la solicitud.
+
+| Código | Descripción |
+|--------|-------------|
+| `200` | Solicitud exitosa |
+| `400` | Verifique que los parámetros fueran correctos |
+| `401` | Clave de API faltante |
+| `403` | Clave API inválida |
+| `404` | Recurso no encontrado |
+| `429` | Límite de tasa excedido |
+| `5xx` | Errores del servidor |
diff --git a/content/docs/es/meta.json b/content/docs/es/meta.json
new file mode 100644
index 000000000..617976bc9
--- /dev/null
+++ b/content/docs/es/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "hiro",
+ "root": true,
+ "pages": ["...tools", "...apis", "...reference", "...resources"]
+}
diff --git a/content/docs/es/reference/stacks.js/(connect)/broadcast-transactions.mdx b/content/docs/es/reference/stacks.js/(connect)/broadcast-transactions.mdx
new file mode 100644
index 000000000..3964f983e
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(connect)/broadcast-transactions.mdx
@@ -0,0 +1,168 @@
+---
+title: Transmitir transacciones
+description: Solicita a los usuarios que firmen transacciones y las transmitan a la cadena de bloques de Stacks.
+---
+import { Badge } from '@/components/ui/badge';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { ChevronRight, Code, Terminal } from 'lucide-react';
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+El proceso de transmitir transacciones es fundamental para interactuar con blockchains, ya sea que estés transfiriendo tokens, desplegando contratos o ejecutando funciones de contratos.
+
+En esta guía, aprenderás cómo:
+
+1. [Instale los paquetes necesarios](#setup-and-installation)
+2. [Conectar a la billetera de un usuario](#connect-to-a-users-wallet)
+3. [Firmar y transmitir transacciones](#sign-and-broadcast-transactions)
+4. [Manejar resultados de transacciones](#handle-transaction-results)
+
+***
+
+## Configuración e instalación
+
+Instale los paquetes necesarios para comenzar a construir y transmitir transacciones:
+
+```package-install
+@stacks/connect @stacks/transactions
+```
+
+## Conectar a la billetera de un usuario
+
+Antes de firmar transacciones, los usuarios necesitan conectar su billetera a su aplicación. Use el `connect` función para iniciar una conexión de billetera:
+
+```ts
+import { connect, isConnected } from '@stacks/connect';
+
+async function connectWallet() {
+ if (!isConnected()) {
+ const response = await connect();
+ console.log('Connected with addresses:', response);
+ }
+}
+```
+
+## Firmar y transmitir transacciones
+
+Hay tres tipos de transacciones que puedes crear: transferencias de STX, implementaciones de contratos y llamadas a contratos.
+
+
+
+
+ Transferencia de STX
+
+
+
+ Despliegue de contratos
+
+
+
+ Ejecución del contrato
+
+
+
+
+ Para transferir tokens STX, utiliza el `request` método con `stx_transferStx`:
+
+ ```ts
+ import { request } from '@stacks/connect';
+
+ async function transferStx() {
+ const response = await request('stx_transferStx', {
+ recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',
+ amount: '100', // in micro-STX (1 STX = 1,000,000 micro-STX)
+ memo: 'Reimbursement', // optional
+ });
+
+ console.log('Transaction ID:', response.txId);
+ }
+ ```
+
+
+
+ Para desplegar un contrato inteligente, utiliza el `request` método con `stx_deployContract`:
+
+ ```ts
+ import { request } from '@stacks/connect';
+
+ async function deployContract() {
+ const codeBody = '(define-public (say-hi) (ok "hello world"))';
+
+ const response = await request('stx_deployContract', {
+ name: 'my-contract',
+ code: codeBody,
+ clarityVersion: 3, // optional, defaults to latest version
+ });
+
+ console.log('Transaction ID:', response.txId);
+ }
+ ```
+
+ Los contratos se implementarán en la dirección de Stacks de la billetera conectada.
+
+
+
+ Para llamar a una función de contrato, utiliza el `request` método con 'stx\_callContract'. Aquí hay un ejemplo usando un contrato simple:
+
+ ```clarity
+ (define-public (say-hi)
+ (print "hi")
+ (ok u0)
+ )
+ ```
+
+ Así es como se llama a esta función:
+
+ ```ts
+ import { request } from '@stacks/connect';
+ import { Cl } from '@stacks/transactions';
+
+ async function callContract() {
+ const response = await request('stx_callContract', {
+ contractAddress: 'ST22T6ZS7HVWEMZHHFK77H4GTNDTWNPQAX8WZAKHJ',
+ contractName: 'my-contract',
+ functionName: 'say-hi',
+ functionArgs: [], // array of Clarity values
+ });
+
+ console.log('Transaction ID:', response.txId);
+ }
+ ```
+
+ Para funciones que toman argumentos, puedes usar el `Cl` espacio de nombres para construir valores de Clarity:
+
+ ```ts
+ const functionArgs = [
+ Cl.uint(123),
+ Cl.stringAscii("hello"),
+ Cl.standardPrincipalCV("ST1X.."),
+ ];
+ ```
+
+
+
+## Manejar resultados de transacciones
+
+Cuando una transacción es firmada y transmitida, el `request` el método devuelve un objeto de respuesta que contiene información sobre la transacción:
+
+```ts
+interface TransactionResponse {
+ txId: string; // The transaction ID
+ txRaw: string; // The raw transaction hex
+}
+```
+
+Puedes usar el ID de la transacción para crear un enlace para ver la transacción en el explorador:
+
+```ts
+async function handleTransaction() {
+ const response = await request('stx_transferStx', {
+ recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',
+ amount: '100',
+ });
+
+ const explorerUrl = `https://explorer.stacks.co/txid/${response.txId}`;
+ console.log('View transaction in explorer:', explorerUrl);
+}
+```
diff --git a/content/docs/es/reference/stacks.js/(connect)/connect-wallet.mdx b/content/docs/es/reference/stacks.js/(connect)/connect-wallet.mdx
new file mode 100644
index 000000000..3c05f0861
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(connect)/connect-wallet.mdx
@@ -0,0 +1,135 @@
+---
+title: Conectar billetera
+description: Aprende cómo conectarte a billeteras de Stacks y autenticar usuarios.
+---
+Aprende cómo integrar conexiones de billetera en tu aplicación de Stacks. Conectar una billetera autentica a los usuarios y permite interacciones con la blockchain como transferencias y llamadas a contratos.
+
+## Lo que aprenderás
+
+:::objectives
+* Instale el `@stacks/connect` paquete
+* Conectar a una billetera y autenticar usuarios
+* Gestionar el estado de autenticación
+* Acceder a los datos de la cuenta del usuario
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Node.js instalado en tu máquina
+* Una configuración de aplicación web (React, Vue o JavaScript puro)
+* Comprensión básica de async/await
+:::
+
+## Inicio rápido
+
+
+
+ ### Instalar paquete
+
+ Agregue el paquete Stacks Connect a su proyecto.
+
+ ```package-install
+ @stacks/connect
+ ```
+
+ Este paquete proporciona todas las funciones necesarias para las conexiones de billeteras y la autenticación de usuarios.
+
+
+
+ ### Conectar y autenticar
+
+ El `connect` La función inicia la conexión de la billetera y almacena los datos del usuario en el almacenamiento local para la persistencia de la sesión.
+
+ ```ts
+ import { connect, isConnected } from '@stacks/connect';
+
+ async function connectWallet() {
+ // Check if already connected
+ if (isConnected()) {
+ console.log('Already authenticated');
+ return;
+ }
+
+ // Connect to wallet
+ const response = await connect();
+ console.log('Connected:', response.addresses);
+ }
+ ```
+
+ Gestiona el estado de autenticación en toda tu aplicación.
+
+ ```ts
+ import { disconnect, isConnected } from '@stacks/connect';
+
+ // Check authentication status
+ const authenticated = isConnected();
+
+ // Logout function
+ function logout() {
+ disconnect(); // Clears storage and wallet selection
+ console.log('User disconnected');
+ }
+ ```
+
+
+
+ ### Acceder a los datos del usuario
+
+ Recuperar direcciones almacenadas y solicitar información detallada de la cuenta.
+
+ ```ts
+ import { getLocalStorage, request } from '@stacks/connect';
+
+ // Get stored addresses from local storage
+ const userData = getLocalStorage();
+ if (userData?.addresses) {
+ const stxAddress = userData.addresses.stx[0].address;
+ const btcAddress = userData.addresses.btc[0].address;
+ console.log('STX:', stxAddress);
+ console.log('BTC:', btcAddress);
+ }
+ ```
+
+ Obtenga información detallada de la cuenta, incluyendo las claves públicas.
+
+ ```ts
+ // Request full account details
+ const accounts = await request('stx_getAccounts');
+ const account = accounts.addresses[0];
+
+ console.log('Address:', account.address);
+ console.log('Public key:', account.publicKey);
+ console.log('Gaia URL:', account.gaiaHubUrl);
+ ```
+
+
+
+ ### Realiza tu primera transacción
+
+ Utilice la conexión autenticada para enviar tokens STX.
+
+ ```ts
+ import { request } from '@stacks/connect';
+
+ async function sendTransaction() {
+ const response = await request('stx_transferStx', {
+ amount: '1000000', // 1 STX in micro-STX
+ recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',
+ memo: 'First transfer', // optional
+ });
+
+ console.log('Transaction ID:', response.txid);
+ }
+ ```
+
+ La billetera solicitará al usuario que apruebe la transacción antes de transmitirla.
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Firmar mensajes](/reference/stacks.js/message-signing): Demostrar la propiedad de la dirección
+* [Transmitir transacciones](/reference/stacks.js/broadcast-transactions): Aprende sobre diferentes tipos de transacciones
+:::
diff --git a/content/docs/es/reference/stacks.js/(connect)/message-signing.mdx b/content/docs/es/reference/stacks.js/(connect)/message-signing.mdx
new file mode 100644
index 000000000..7ed6944bf
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(connect)/message-signing.mdx
@@ -0,0 +1,199 @@
+---
+title: Firmar mensajes
+description: Aprende cómo firmar y verificar mensajes para demostrar la propiedad de una dirección y autorizar acciones
+---
+Aprende cómo implementar la firma de mensajes en tu aplicación Stacks. La firma de mensajes permite a los usuarios probar criptográficamente que controlan una dirección sin realizar una transacción en la cadena, permitiendo autenticación, autorización y declaraciones verificables.
+
+:::objectives
+* Conéctese a la billetera de un usuario y solicite firmas de mensajes
+* Firme tanto mensajes de texto simples como datos estructurados
+* Verificar firmas para garantizar la autenticidad
+:::
+
+:::prerequisites
+* Node.js instalado en tu máquina
+* Un editor de código como VS Code
+:::
+
+## Instalación
+
+Instale los paquetes necesarios para la firma y verificación de mensajes.
+
+```package-install
+@stacks/connect @stacks/encryption
+```
+
+## Conectar a la billetera
+
+Antes de firmar mensajes, establezca una conexión con la billetera del usuario. La conexión persiste a través de las recargas de página.
+
+```ts
+import { connect, isConnected } from '@stacks/connect';
+
+async function connectWallet() {
+ if (!isConnected()) {
+ const response = await connect();
+ console.log('Connected addresses:', response.addresses);
+ }
+}
+```
+
+Llama a esta función cuando tu aplicación se cargue o cuando el usuario haga clic en un botón de conexión.
+
+## Firmar mensajes de texto
+
+Solicitar una firma para un mensaje de texto simple utilizando el `request` método.
+
+```ts
+import { request } from '@stacks/connect';
+
+async function signMessage() {
+ const message = 'Hello World';
+
+ const response = await request('stx_signMessage', {
+ message,
+ });
+
+ console.log('Signature:', response.signature);
+ console.log('Public key:', response.publicKey);
+
+ return response;
+}
+```
+
+La cartera mostrará el mensaje al usuario para su aprobación antes de firmar.
+
+## Firmar datos estructurados
+
+Para datos más complejos, utilice la firma de mensajes estructurados con valores de Clarity.
+
+```ts
+import { request } from '@stacks/connect';
+import { Cl } from '@stacks/transactions';
+
+async function signStructuredMessage() {
+ const message = Cl.tuple({
+ action: Cl.stringAscii('transfer'),
+ amount: Cl.uint(1000),
+ recipient: Cl.stringAscii('alice.btc')
+ });
+
+ const domain = Cl.tuple({
+ name: Cl.stringAscii('My App'),
+ version: Cl.stringAscii('1.0.0'),
+ 'chain-id': Cl.uint(1) // 1 for mainnet
+ });
+
+ const response = await request('stx_signStructuredMessage', {
+ message,
+ domain
+ });
+
+ return response;
+}
+```
+
+Los mensajes estructurados proporcionan una mejor seguridad de tipos y son más fáciles de analizar en la cadena.
+
+## Verificar firmas
+
+Validar firmas para asegurar que coincidan con el mensaje esperado y la clave pública.
+
+```ts
+import { verifyMessageSignatureRsv } from '@stacks/encryption';
+
+async function verifySignature(
+ message: string,
+ signature: string,
+ publicKey: string
+): Promise {
+ const isValid = verifyMessageSignatureRsv({
+ message,
+ signature,
+ publicKey
+ });
+
+ if (isValid) {
+ console.log('✓ Signature verified successfully');
+ } else {
+ console.log('✗ Invalid signature');
+ }
+
+ return isValid;
+}
+```
+
+Siempre verifique las firmas antes de confiar en los datos firmados.
+
+### Completar el flujo de verificación
+
+```ts
+async function signAndVerify() {
+ // Request signature
+ const message = 'Authorize login at ' + new Date().toISOString();
+ const signResponse = await request('stx_signMessage', { message });
+
+ // Verify immediately
+ const isValid = await verifySignature(
+ message,
+ signResponse.signature,
+ signResponse.publicKey
+ );
+
+ if (isValid) {
+ // Proceed with authenticated action
+ console.log('Authentication successful');
+ }
+}
+```
+
+## Pruébalo
+
+Crea un sistema de autenticación simple utilizando firmas de mensajes.
+
+```ts
+// Generate a unique challenge
+function generateChallenge(): string {
+ const nonce = Math.random().toString(36).substring(7);
+ const timestamp = Date.now();
+ return `Sign this message to authenticate:\nNonce: ${nonce}\nTime: ${timestamp}`;
+}
+
+// Complete auth flow
+async function authenticate() {
+ const challenge = generateChallenge();
+
+ try {
+ const response = await request('stx_signMessage', {
+ message: challenge
+ });
+
+ const isValid = verifyMessageSignatureRsv({
+ message: challenge,
+ signature: response.signature,
+ publicKey: response.publicKey
+ });
+
+ if (isValid) {
+ // Store auth token or session
+ localStorage.setItem('auth', JSON.stringify({
+ publicKey: response.publicKey,
+ timestamp: Date.now()
+ }));
+
+ return { success: true };
+ }
+ } catch (error) {
+ console.error('Authentication failed:', error);
+ }
+
+ return { success: false };
+}
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Transmitir transacciones](/reference/stacks.js/broadcast-transactions): Aprende cómo firmar y transmitir transacciones
+* [Referencia de la API de Connect](/reference/stacks.js/packages/connect): Explora todos los métodos disponibles
+:::
diff --git a/content/docs/es/reference/stacks.js/(connect)/migration-guide.mdx b/content/docs/es/reference/stacks.js/(connect)/migration-guide.mdx
new file mode 100644
index 000000000..9c3cbebca
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(connect)/migration-guide.mdx
@@ -0,0 +1,103 @@
+---
+title: Guía de Migración
+description: Cómo migrar de v7.x.x a v8.x.x de @stacks/connect
+---
+import { Steps, Step } from 'fumadocs-ui/components/steps'
+
+Durante un tiempo, la comunidad de Stacks ha estado trabajando en un nuevo estándar para la comunicación entre billeteras y dapps.
+Stacks Connect y proyectos relacionados ahora utilizan estándares como [WBIPs](https://wbips.netlify.app/) y [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) para permitir que las billeteras se comuniquen con las dapps de una manera más simplificada y flexible.
+
+:::callout
+### Estado de la Migración
+
+**Siéntete libre de seguir usando Stacks Connect `7.x.x` mientras las cosas se estabilizan.**
+El `7.x.x` La versión puede seguir siendo mejor soportada por algunas billeteras.
+
+Para la versión heredada de `@stacks/connect` usando tokens JWT, puedes usar:
+
+```sh
+npm install @stacks/connect@7.10.1
+```
+:::
+
+## Obsolescencias
+
+Las siguientes clases, métodos y tipos están obsoletos en favor de los nuevos `request` Métodos RPC:
+
+* `show...` y `open...` métodos
+* `authenticate` método
+* `UserSession` clase y funcionalidad relacionada
+* `AppConfig` clase
+* `SessionOptions` interfaz
+* `SessionData` interfaz
+* `UserData` interfaz
+* `SessionDataStore` clase
+* `InstanceDataStore` clase
+* `LocalStorageStore` clase
+
+:::callout
+### Compatibilidad hacia atrás
+
+Para facilitar la migración, el familiar `UserSession` & `AppConfig` la clase aún existe y es semi-compatible con versiones anteriores para el `8.x.x` lanzamiento.
+"Almacenará en caché" la dirección del usuario en el almacenamiento local y permitirá el acceso a ella a través del `loadUserData` método (como se hizo anteriormente).
+:::
+
+## Pasos de migración
+
+Para actualizar desde `<=7.x.x` a la última/`8.x.x`, sigue estos pasos:
+
+
+
+ ```sh
+ npm install @stacks/connect@latest
+ ```
+
+
+
+ Cambiar de `showXyz`, `openXyz`, `doXyz` métodos al `request` método:
+
+ * `request` sigue el patrón `request(method: string, params: object)`, ver [Uso](#usage) para más detalles
+ * `request` es una función asíncrona, así que reemplaza el `onFinish` y `onCancel` devoluciones de llamada con `.then().catch()` o `try & await`
+
+ Ejemplos:
+
+ * `showConnect()`, `authenticate()` → `connect()`
+ * `useConnect().doContractCall({})` → `request("stx_callContract", {})`
+ * `openContractDeploy()` → `request("stx_deployContract", {})`
+
+
+
+ Cambiar de `showConnect` o `authenticate` a `connect()` métodos:
+
+ * `connect()` es un alias para `request({forceWalletSelect: true}, 'getAddresses')`
+ * `connect()` por defecto almacena en caché la dirección del usuario en el almacenamiento local
+
+
+
+ * Cambiar de `UserSession.isSignedIn()` a `isConnected()`
+ * Cambiar de `UserSession.signUserOut()` a `disconnect()`
+
+
+
+ * Eliminar código que haga referencia a métodos obsoletos (`AppConfig`, `UserSession`, etc.)
+ * Elimina el `@stacks/connect-react` paquete
+ * Es posible que necesites recargar manualmente un componente para ver las actualizaciones del almacenamiento local
+ * Ya no se necesitan hooks personalizados para usar Stacks Connect
+ * Estamos trabajando en un nuevo `@stacks/react` paquete que hará que el uso sea aún más fácil en el futuro (por ejemplo, seguimiento del estado de las transacciones, recarga de componentes cuando se establece una conexión, actualización de la página cuando cambia la red, y más)
+
+
+
+## Acceso a Direcciones
+
+Anteriormente, el `UserSession` La clase se utilizaba para acceder a las direcciones y datos del usuario, lo cual abstraía los detalles de implementación subyacentes.
+Ahora, el `request` El método se utiliza para interactuar directamente con la billetera, dando a los desarrolladores un control más explícito y claridad sobre lo que está sucediendo internamente.
+Este enfoque manual hace que la interacción con la billetera sea más transparente y personalizable.
+Los desarrolladores pueden gestionar manualmente la dirección del usuario actualmente conectado en, por ejemplo, almacenamiento local, jotai, etc. o usar el `connect()`/`request()` método para almacenar en caché la dirección en el almacenamiento local.
+
+:::callout
+type: warn
+
+### Nota de seguridad
+
+Por razones de seguridad, el `8.x.x` release solo devuelve la dirección de la red actual (donde anteriormente se devolvían las direcciones tanto de mainnet como de testnet).
+:::
diff --git a/content/docs/es/reference/stacks.js/(connect)/wallet-support.mdx b/content/docs/es/reference/stacks.js/(connect)/wallet-support.mdx
new file mode 100644
index 000000000..0ef88a5d3
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(connect)/wallet-support.mdx
@@ -0,0 +1,56 @@
+---
+title: Soporte de Billetera
+description: Información de compatibilidad para diferentes proveedores de billeteras
+---
+Esta página proporciona información detallada sobre qué métodos y eventos son compatibles con diferentes proveedores de billeteras en el ecosistema de Stacks.
+
+## Compatibilidad de Métodos
+
+* 🔴 Sin soporte (aún)
+* 🟡 Soporte parcial
+* 🟢 Soportado
+
+| Método | Cuero | Tipo Xverse |
+|-----------------------------|----------------------------------------------|---------------------------------------------------------------|
+| `getAddresses` | 🟡 Sin soporte para fines experimentales | 🟡 Uso `wallet_connect` en su lugar |
+| `sendTransfer` | 🟡 Espera `amount` como cadena | 🟡 Espera `amount` como número |
+| `signPsbt` | 🟡 Usa solo el array de índices de firma | 🟡 Usa `signInputs` registro en lugar de matriz |
+| `stx_getAddresses` | 🟢 | 🔴 |
+| `stx_getAccounts` | 🔴 | 🟢 |
+| `stx_getNetworks` | 🔴 | 🔴 |
+| `stx_transferStx` | 🟢 | 🟢 |
+| `stx_transferSip10Ft` | 🟢 | 🔴 |
+| `stx_transferSip9Nft` | 🟢 | 🔴 |
+| `stx_callContract` | 🟡 Valores de Clarity codificados en hexadecimal solamente | 🟡 Valores de Clarity codificados en hexadecimal solamente, sin soporte para `postConditions` |
+| `stx_deployContract` | 🟡 Valores de Clarity codificados en hexadecimal solamente | 🟡 Valores de Clarity codificados en hexadecimal solamente, sin soporte para `postConditions` |
+| `stx_signTransaction` | 🟡 Valores de Clarity codificados en hexadecimal solamente | 🟡 Valores de Clarity codificados en hexadecimal solamente |
+| `stx_signMessage` | 🟡 Valores de Clarity codificados en hexadecimal solamente | 🟡 Valores de Clarity codificados en hexadecimal solamente |
+| `stx_signStructuredMessage` | 🟡 Valores de Clarity codificados en hexadecimal solamente | 🟡 Valores de Clarity codificados en hexadecimal solamente |
+| `stx_updateProfile` | 🔴 | 🔴 |
+
+## Compatibilidad de Eventos
+
+| Evento | Leather | Xverse |
+|---------------------|---------|--------|
+| `stx_accountChange` | 🔴 | 🔴 |
+| `stx_networkChange` | 🔴 | 🔴 |
+
+## Capa de Compatibilidad
+
+El `request` método en `@stacks/connect` agrega una capa de auto-compatibilidad para diferentes proveedores de billeteras. Esto ayuda a unificar la interfaz donde los proveedores de billeteras pueden implementar métodos y resultados de manera diferente.
+
+* 🟢 No se necesitan anulaciones para ninguna cartera
+* 🔵 Tiene anulaciones de compatibilidad que mantienen la funcionalidad
+* 🟡 Tiene anulaciones disruptivas que pueden perder cierta información
+
+| Método | Estado | Notas |
+| --------------------------- | ------ | ---------------------------------------------------------------------------------------------------- |
+| `getAddresses` | 🔵 | Se asigna a `wallet_connect` para billeteras tipo Xverse |
+| `sendTransfer` | 🔵 | Convierte `amount` para número en Xverse, cadena en Leather |
+| `signPsbt` | 🟡 | Transforma el formato PSBT para Leather (base64 a hex) con reestructuración con pérdidas de `signInputs` |
+| `stx_getAddresses` | 🔵 | Se asigna a `wallet_connect` para billeteras tipo Xverse |
+| `stx_callContract` | 🔵 | Transforma los valores de Clarity a formato codificado en hexadecimal para compatibilidad |
+| `stx_deployContract` | 🔵 | Transforma los valores de Clarity a formato codificado en hexadecimal para compatibilidad |
+| `stx_signTransaction` | 🔵 | Transforma los valores de Clarity a formato codificado en hexadecimal para compatibilidad |
+| `stx_signMessage` | 🔵 | Transforma los valores de Clarity a formato codificado en hexadecimal para compatibilidad |
+| `stx_signStructuredMessage` | 🔵 | Transforma los valores de Clarity a formato codificado en hexadecimal para compatibilidad |
diff --git a/content/docs/es/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx b/content/docs/es/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
new file mode 100644
index 000000000..bdcad9224
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx
@@ -0,0 +1,201 @@
+---
+title: Integración del oráculo Pyth
+sidebarTitle: Integración del oráculo Pyth
+description: En esta guía, aprenderás cómo integrar las fuentes de precios de Pyth Network en tu aplicación frontend utilizando Stacks.js.
+isNew: true
+---
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+import { Steps, Step } from '@/components/steps';
+import { ArrowRight, Check } from 'lucide-react';
+
+## Lo que aprenderás
+
+:::objectives
+* Instalar y configurar el SDK de Pyth
+* Obtener mensajes VAA de la API de Hermes
+* Construir transacciones con datos de oráculo
+* Manejar las post-condiciones para las tarifas del oráculo
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Una aplicación de React o Node.js con Stacks.js instalado
+* Comprensión de [Contratos de oráculo Pyth](/resources/clarity/external-data)
+:::
+
+## Inicio rápido
+
+
+
+ ### Instalar dependencias
+
+ Instale el SDK de Pyth junto con sus paquetes existentes de Stacks.js:
+
+ ```package-install
+ @pythnetwork/price-service-client buffer
+ ```
+
+ El paquete buffer es necesario para la conversión de formato de datos en entornos de navegador.
+
+
+
+ ### Configurar el cliente de Pyth
+
+ Crear un servicio para manejar las interacciones del feed de precios de Pyth:
+
+ ```typescript services/pyth.ts
+ import { PriceServiceConnection } from '@pythnetwork/price-service-client';
+ import { Buffer } from 'buffer';
+
+ // Price feed IDs
+ export const PRICE_FEEDS = {
+ BTC_USD: '0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',
+ STX_USD: '0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17',
+ ETH_USD: '0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',
+ USDC_USD: '0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a'
+ };
+
+ // Initialize Pyth client
+ const pythClient = new PriceServiceConnection(
+ 'https://hermes.pyth.network',
+ {
+ priceFeedRequestConfig: {
+ binary: true // Request binary format for on-chain use
+ }
+ }
+ );
+
+ export async function fetchPriceUpdateVAA(priceFeedId: string): Promise {
+ try {
+ // Fetch the latest VAA for the price feed
+ const vaas = await pythClient.getLatestVaas([priceFeedId]);
+
+ if (!vaas || vaas.length === 0) {
+ throw new Error('No VAA data received');
+ }
+
+ // Convert base64 to hex for Clarity
+ const messageBuffer = Buffer.from(vaas[0], 'base64');
+ const hexString = messageBuffer.toString('hex');
+
+ return `0x${hexString}`;
+ } catch (error) {
+ console.error('Failed to fetch price VAA:', error);
+ throw error;
+ }
+ }
+ ```
+
+
+
+ ### Construir transacciones habilitadas por oráculo
+
+ Crear una transacción que incluya datos de precios actualizados:
+
+ ```typescript components/PythTransaction.tsx
+ import { request } from '@stacks/connect';
+ import {
+ Cl,
+ PostConditionMode
+ } from '@stacks/transactions';
+ import { fetchPriceUpdateVAA, PRICE_FEEDS } from '../services/pyth';
+ import { useState } from 'react';
+
+ export function MintWithOraclePrice() {
+ const [loading, setLoading] = useState(false);
+
+ const handleMint = async () => {
+ setLoading(true);
+ try {
+ // Fetch fresh price data
+ const priceVAA = await fetchPriceUpdateVAA(PRICE_FEEDS.BTC_USD);
+
+ // Convert hex string to buffer Clarity value
+ const vaaBuffer = Cl.bufferFromHex(priceVAA.slice(2));
+
+ // Call contract with price data using request
+ const response = await request('stx_callContract', {
+ contract: 'SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R.benjamin-club',
+ functionName: 'mint-for-hundred-dollars',
+ functionArgs: [vaaBuffer],
+ postConditionMode: 'deny',
+ network: 'mainnet'
+ });
+
+ console.log('Transaction submitted:', response.txid);
+ alert(`NFT minted! Transaction ID: ${response.txid}`);
+ } catch (error) {
+ console.error('Minting failed:', error);
+ alert('Failed to mint NFT');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+ {loading ? 'Processing...' : 'Mint NFT for $100'}
+
+ );
+ }
+ ```
+
+
+
+ ### Agregar post-condiciones para las tarifas del oráculo
+
+ Las actualizaciones del oráculo de Pyth requieren una pequeña tarifa. Incluya condiciones posteriores al llamar a contratos:
+
+ ```typescript components/MintWithPostConditions.tsx
+ import { request } from '@stacks/connect';
+ import { Cl, Pc } from '@stacks/transactions';
+ import { fetchPriceUpdateVAA, PRICE_FEEDS } from '../services/pyth';
+
+ export function MintWithPostConditions() {
+ const handleMint = async () => {
+ const userAddress = 'SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R';
+
+ // Create post-conditions
+ const postConditions = [
+ // Oracle fee (1 uSTX)
+ Pc.principal(userAddress).willSendLte(1).ustx(),
+ // sBTC transfer for $100 worth (example: 100,000 sats)
+ Pc.principal(userAddress)
+ .willSendEq(100000)
+ .ft('SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sbtc-token', 'sbtc')
+ ];
+
+ try {
+ const priceVAA = await fetchPriceUpdateVAA(PRICE_FEEDS.BTC_USD);
+
+ const response = await request('stx_callContract', {
+ contract: `${userAddress}.benjamin-club`,
+ functionName: 'mint-for-hundred-dollars',
+ functionArgs: [Cl.bufferFromHex(priceVAA.slice(2))],
+ postConditions,
+ postConditionMode: 'deny',
+ network: 'mainnet'
+ });
+
+ console.log('Transaction successful:', response.txid);
+ } catch (error) {
+ console.error('Transaction failed:', error);
+ }
+ };
+
+ return Mint with Post-Conditions ;
+ }
+ ```
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Contratos de Clarity](/resources/clarity/external-data): Aprende cómo integrar el oráculo Pyth con contratos de Clarity.
+* [Pruebas con Clarinet](/tools/clarinet/pyth-oracle-integration): Aprende cómo probar la integración del oráculo Pyth con Clarinet.
+:::
diff --git a/content/docs/es/reference/stacks.js/(integrations)/react-native-integration.mdx b/content/docs/es/reference/stacks.js/(integrations)/react-native-integration.mdx
new file mode 100644
index 000000000..706d0004d
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(integrations)/react-native-integration.mdx
@@ -0,0 +1,292 @@
+---
+title: Uso de Stacks.js con React Native
+sidebarTitle: Integración de React Native
+description: Aprende cómo integrar la funcionalidad de la blockchain de Stacks en aplicaciones móviles de React Native
+---
+Stacks.js puede integrarse en aplicaciones de React Native para llevar la funcionalidad de blockchain a dispositivos móviles. Este tutorial te guía a través de la configuración de un proyecto de React Native con Expo y su configuración para trabajar con las bibliotecas de Stacks.js.
+
+:::objectives
+* Configurar un proyecto Expo configurado para Stacks.js
+* Instalar y configurar los polyfills necesarios para React Native
+* Generar billeteras y firmar transacciones en una aplicación móvil
+* Manejar las limitaciones del entorno JavaScript de React Native
+* Construye una aplicación móvil funcional de Stacks
+:::
+
+:::prerequisites
+* Node.js y npm instalados en tu máquina de desarrollo
+* Conocimiento básico de React Native y Expo
+* Familiaridad con los conceptos de Stacks.js
+* Dispositivo o simulador iOS o Android para pruebas
+:::
+
+## Configurar el proyecto Expo
+
+Comience creando un nuevo proyecto de Expo. La última versión de Expo proporciona la mejor compatibilidad con los polyfills de Stacks.js.
+
+```terminal
+$ npx create-expo-app@latest my-stacks-app
+$ cd my-stacks-app
+```
+
+El proyecto de plantilla incluye todo lo necesario para comenzar a construir. Pruebe la configuración inicial ejecutando el servidor de desarrollo.
+
+```terminal
+$ npm start
+```
+
+Conecte su dispositivo móvil usando la aplicación Expo Go y escanee el código QR para verificar que el proyecto base funciona correctamente.
+
+## Instalar las dependencias necesarias
+
+El entorno JavaScript de React Native carece de ciertas APIs de Node.js y del navegador que Stacks.js requiere. Instale las bibliotecas principales de Stacks junto con los polyfills necesarios.
+
+```terminal
+$ npm install @stacks/transactions @stacks/wallet-sdk
+```
+
+Instale las dependencias del polyfill como dependencias de desarrollo para manejar las APIs faltantes.
+
+```terminal
+$ npm install --save-dev buffer process react-native-get-random-values \
+ text-encoding readable-stream crypto-browserify @peculiar/webcrypto
+```
+
+Estos polyfills proporcionan:
+
+* `buffer` y `process` - Globales de Node.js
+* `react-native-get-random-values` - Valores aleatorios criptográficos
+* `text-encoding` - APIs de TextEncoder/TextDecoder
+* `crypto-browserify` y `@peculiar/webcrypto` - Funciones criptográficas
+
+## Configurar el empaquetador Metro
+
+El empaquetador Metro necesita configuración para resolver correctamente los módulos de Node.js. Cree un archivo de configuración personalizado de Metro.
+
+```terminal
+$ npx expo customize metro.config.js
+```
+
+Actualice la configuración para mapear los módulos de Node.js a sus versiones compatibles con React Native.
+
+```js metro.config.js
+const { getDefaultConfig } = require("expo/metro-config");
+
+const config = getDefaultConfig(__dirname);
+
+config.resolver.extraNodeModules = {
+ stream: require.resolve("readable-stream"),
+ crypto: require.resolve("crypto-browserify"),
+};
+
+module.exports = config;
+```
+
+Esta configuración garantiza que cuando Stacks.js solicita módulos de Node.js, Metro proporciona los polyfills adecuados.
+
+## Configurar polyfills globales
+
+Crear un sistema de polyfill para hacer que las APIs del navegador y Node.js estén disponibles en React Native. Esto requiere modificar el punto de entrada de la aplicación.
+
+### Crear el archivo polyfill
+
+Cree un nuevo archivo para inicializar todos los objetos globales requeridos.
+
+```js polyfill.js
+import { Buffer } from "buffer/";
+import process from "process";
+import "react-native-get-random-values";
+import { TextDecoder, TextEncoder } from "text-encoding";
+
+global.process = process;
+global.Buffer = Buffer;
+global.TextEncoder = TextEncoder;
+global.TextDecoder = TextDecoder;
+```
+
+### Crear punto de entrada personalizado
+
+Crear un nuevo punto de entrada que cargue polyfills antes de que la aplicación se inicie.
+
+```js index.js
+import "./polyfill";
+import { Crypto } from "@peculiar/webcrypto";
+
+Object.assign(global.crypto, new Crypto());
+
+import "expo-router/entry";
+```
+
+### Actualizar package.json
+
+Dirija la aplicación para que utilice el nuevo punto de entrada.
+
+```json package.json
+{
+ "main": "index.js",
+ // ... other configuration
+}
+```
+
+:::callout
+type: warn
+
+### Errores de inicialización en tiempo de ejecución
+
+Los polyfills deben cargarse en archivos separados como se muestra. Cargarlos en el mismo archivo puede causar errores de inicialización en tiempo de ejecución.
+:::
+
+## Implementar la funcionalidad de pilas
+
+Con el entorno configurado, ahora puede utilizar Stacks.js en sus componentes de React Native. Actualice la pantalla principal para demostrar la generación de billeteras y la firma de transacciones.
+
+### Importar módulos de Stacks.js
+
+Edite el componente de la pantalla principal para importar las funciones necesarias de Stacks.js.
+
+```tsx app/(tabs)/index.tsx
+import {
+ TransactionVersion,
+ getAddressFromPrivateKey,
+ makeSTXTokenTransfer,
+} from "@stacks/transactions";
+import { Wallet, generateSecretKey, generateWallet } from "@stacks/wallet-sdk";
+import { useState } from "react";
+import { Button } from "react-native";
+```
+
+### Configurar el estado del componente
+
+Crear variables de estado para gestionar los datos de la cartera y la retroalimentación del usuario.
+
+```tsx app/(tabs)/index.tsx
+export default function HomeScreen() {
+ const [mnemonic, setMnemonic] = useState("Press button to generate");
+ const [wallet, setWallet] = useState(null);
+ const [log, setLog] = useState("");
+
+ // Component implementation continues...
+}
+```
+
+### Generar billetera y firmar transacción
+
+Implementar la funcionalidad principal para crear una billetera y firmar una transacción.
+
+```tsx app/(tabs)/index.tsx
+const generate = async () => {
+ try {
+ // Generate a new seed phrase
+ const mnemonic = generateSecretKey();
+ setMnemonic(mnemonic);
+
+ // Create wallet from seed phrase
+ const wallet = await generateWallet({
+ secretKey: mnemonic,
+ password: "",
+ });
+ setWallet(wallet);
+
+ // Create and sign a transaction
+ const txOptions = {
+ amount: 1000,
+ anchorMode: "any" as const,
+ recipient: "SP3W993D3BRDYB284CY3SBFDEGTC5XEDJPDEA21CN",
+ senderKey: wallet.accounts[0].stxPrivateKey,
+ fee: 300,
+ network: "testnet" as const,
+ nonce: 0,
+ };
+
+ const transaction = await makeSTXTokenTransfer(txOptions);
+ setLog("Transaction signed successfully ✓");
+ } catch (error) {
+ setLog(`Error: ${error.message}`);
+ }
+};
+```
+
+### Construir la interfaz de usuario
+
+Crear una interfaz de usuario simple para mostrar información de la billetera y activar la generación de billeteras.
+
+```tsx app/(tabs)/index.tsx
+return (
+
+ Stacks Wallet Demo
+
+
+ Seed Phrase
+ {mnemonic}
+
+
+
+ {wallet && (
+
+ Wallet Address
+
+ {getAddressFromPrivateKey(
+ wallet.accounts[0].stxPrivateKey,
+ TransactionVersion.Testnet
+ )}
+
+
+ )}
+
+ {log && (
+
+ Status
+ {log}
+
+ )}
+
+);
+```
+
+## Prueba tu implementación
+
+Ejecute su aplicación para verificar que todo funcione correctamente.
+
+```terminal
+$ npm start
+```
+
+Cuando presionas "Generar Nueva Billetera":
+
+1. Una nueva frase semilla aparece
+2. La dirección de la billetera se muestra a continuación
+3. Una transacción es firmada (no transmitida)
+4. Mensaje de éxito confirma la firma
+
+:::callout
+type: tip
+
+### Almacenamiento seguro
+
+Para aplicaciones de producción, nunca muestre frases semilla directamente. Implemente almacenamiento seguro utilizando bibliotecas como `react-native-keychain` o `expo-secure-store`.
+:::
+
+## Pruébalo
+
+Amplíe la implementación básica con características adicionales.
+
+```tsx
+// Challenge: Add a function to check STX balance
+const checkBalance = async (address: string) => {
+ // Implement balance checking
+ // Hint: You'll need to use @stacks/blockchain-api-client
+};
+
+// Challenge: Implement transaction broadcasting
+const broadcastTransaction = async (transaction: StacksTransaction) => {
+ // Implement broadcasting logic
+ // Remember to handle network selection
+};
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Paquete de transacciones](/reference/stacks.js/packages/transactions): Aprende sobre el paquete de transacciones.
+* [Paquete de red](/reference/stacks.js/packages/network): Aprende sobre las utilidades del paquete de red.
+:::
diff --git a/content/docs/es/reference/stacks.js/(local-accounts)/build-transactions.mdx b/content/docs/es/reference/stacks.js/(local-accounts)/build-transactions.mdx
new file mode 100644
index 000000000..b234d6a43
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(local-accounts)/build-transactions.mdx
@@ -0,0 +1,259 @@
+---
+title: Construyendo transacciones
+sidebarTitle: Construir transacciones
+description: Aprende cómo construir transacciones de forma programática para tener un control completo sobre las interacciones con la blockchain.
+---
+:::objectives
+* Construir transacciones firmadas para transmisión inmediata
+* Crear transacciones sin firmar para flujos de trabajo de firma múltiple
+* Implementar transacciones patrocinadas para pagar tarifas por los usuarios
+:::
+
+## Tipos de transacciones
+
+Stacks admite cinco tipos principales de transacciones, cada uno con un propósito específico.
+
+```typescript
+// STX Transfer - Send native tokens
+const stxTransfer = await makeSTXTokenTransfer(options);
+
+// Contract Deployment - Deploy Clarity contracts
+const deployment = await makeContractDeploy(options);
+
+// Contract Call - Execute contract functions
+const contractCall = await makeContractCall(options);
+
+// Each transaction type accepts similar base options:
+interface TransactionOptions {
+ senderKey: string; // Private key for signing
+ network: string; // 'mainnet' or 'testnet'
+ fee?: bigint; // Manual fee in microSTX
+ nonce?: bigint; // Manual nonce
+ anchorMode?: AnchorMode; // Block anchoring strategy
+}
+```
+
+## Construyendo transacciones firmadas
+
+Las transacciones firmadas están listas para transmitirse inmediatamente. La clave privada firma durante la creación.
+
+### Transferencia de tokens STX
+
+```typescript
+import { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';
+
+const transaction = await makeSTXTokenTransfer({
+ recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ amount: 1000000n, // 1 STX = 1,000,000 microSTX
+ senderKey: 'your-private-key-hex',
+ network: 'testnet',
+ memo: 'Payment for services', // Optional memo (max 34 bytes)
+});
+
+const result = await broadcastTransaction({ transaction });
+console.log('Transaction ID:', result.txid);
+```
+
+### Implementación de contratos inteligentes
+
+```typescript
+import { makeContractDeploy, ClarityVersion } from '@stacks/transactions';
+
+const contractCode = `
+(define-public (say-hello)
+ (ok "Hello, Stacks!"))
+`;
+
+const transaction = await makeContractDeploy({
+ contractName: 'hello-world',
+ codeBody: contractCode,
+ senderKey: 'your-private-key-hex',
+ network: 'testnet',
+ clarityVersion: ClarityVersion.Clarity3,
+});
+
+const result = await broadcastTransaction({ transaction });
+```
+
+### Llamadas a funciones de contrato
+
+```typescript
+import { makeContractCall, Cl } from '@stacks/transactions';
+
+const transaction = await makeContractCall({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'counter',
+ functionName: 'increment',
+ functionArgs: [Cl.uint(1)],
+ senderKey: 'your-private-key-hex',
+ network: 'testnet',
+});
+```
+
+## Transacciones no firmadas
+
+Crear transacciones sin firmar para flujos de trabajo de firma múltiple o firma fuera de línea.
+
+```typescript
+import { makeUnsignedSTXTokenTransfer, TransactionSigner } from '@stacks/transactions';
+import { publicKeyFromPrivate } from '@stacks/encryption';
+
+// Create unsigned transaction
+const publicKey = publicKeyFromPrivate('your-private-key');
+
+const unsignedTx = await makeUnsignedSTXTokenTransfer({
+ recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ amount: 1000000n,
+ publicKey,
+ network: 'testnet',
+});
+
+// Sign separately
+const signer = new TransactionSigner(unsignedTx);
+signer.signOrigin('your-private-key');
+
+const signedTx = signer.transaction;
+```
+
+## Transacciones patrocinadas
+
+Permita que una cuenta pague las tarifas de la transacción de otra cuenta.
+
+```typescript
+// User creates sponsored transaction
+const userTx = await makeContractCall({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'my-contract',
+ functionName: 'transfer',
+ functionArgs: [Cl.principal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')],
+ senderKey: 'user-private-key',
+ sponsored: true,
+ fee: 0n, // User doesn't pay
+ network: 'testnet',
+});
+
+// Sponsor completes and pays
+import { sponsorTransaction } from '@stacks/transactions';
+
+const sponsoredTx = await sponsorTransaction({
+ transaction: userTx,
+ sponsorPrivateKey: 'sponsor-private-key',
+ fee: 2000n, // Sponsor pays the fee
+ network: 'testnet',
+});
+
+const result = await broadcastTransaction({ transaction: sponsoredTx });
+```
+
+## Transacciones de firma múltiple
+
+Requerir múltiples firmas para una seguridad mejorada.
+
+```typescript
+// Create multi-sig transaction (2-of-3)
+const publicKeys = [publicKey1, publicKey2, publicKey3];
+
+const multiSigTx = await makeUnsignedSTXTokenTransfer({
+ recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ amount: 5000000n,
+ numSignatures: 2, // Require 2 of 3
+ publicKeys,
+ network: 'testnet',
+});
+
+// Collect signatures
+const signer = new TransactionSigner(multiSigTx);
+signer.signOrigin(privateKey1); // First signature
+signer.appendOrigin(privateKey2); // Second signature
+
+const signedTx = signer.transaction;
+```
+
+## Trabajando con valores de Clarity
+
+Utilice el `Cl` ayudante para argumentos de contrato con seguridad de tipos.
+
+```typescript
+import { Cl } from '@stacks/transactions';
+
+const functionArgs = [
+ // Primitives
+ Cl.uint(42),
+ Cl.int(-10),
+ Cl.bool(true),
+ Cl.stringUtf8('Hello 世界'),
+ Cl.stringAscii('Hello World'),
+
+ // Principals
+ Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG'),
+ Cl.contractPrincipal('ST123...', 'my-contract'),
+
+ // Composites
+ Cl.list([Cl.uint(1), Cl.uint(2), Cl.uint(3)]),
+ Cl.tuple({
+ name: Cl.stringUtf8('Alice'),
+ age: Cl.uint(30)
+ }),
+
+ // Optionals and responses
+ Cl.some(Cl.uint(42)),
+ Cl.none(),
+ Cl.ok(Cl.uint(200)),
+ Cl.err(Cl.uint(404))
+];
+```
+
+## Postcondiciones
+
+Agregar restricciones de seguridad para proteger a los usuarios de transferencias inesperadas.
+
+```typescript
+import { Pc, PostConditionMode } from '@stacks/transactions';
+
+const transaction = await makeContractCall({
+ // ... other options
+ postConditions: [
+ // Sender must send exactly 1 STX
+ Pc.principal('ST1ADDRESS...')
+ .willSendEq(1000000n)
+ .ustx(),
+
+ // Contract must transfer tokens
+ Pc.principal('ST2CONTRACT...')
+ .willSendGte(100n)
+ .ft('ST2CONTRACT.token-contract', 'my-token')
+ ],
+ postConditionMode: PostConditionMode.Deny, // Strict mode
+});
+```
+
+## Estimación de tarifas
+
+Obtenga estimaciones precisas de tarifas antes de transmitir.
+
+```typescript
+import { estimateFee } from '@stacks/transactions';
+
+// Build transaction first
+const tx = await makeSTXTokenTransfer({
+ recipient: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ amount: 1000000n,
+ senderKey: privateKey,
+ network: 'testnet',
+ fee: 1n, // Minimal fee for estimation
+});
+
+// Estimate appropriate fee
+const feeRate = await estimateFee(tx);
+tx.setFee(feeRate);
+
+// Now broadcast with accurate fee
+const result = await broadcastTransaction({ transaction: tx });
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Llamadas de contrato](/reference/stacks.js/contract-calls): Aprende cómo llamar a funciones de contratos.
+* [Postcondiciones](/reference/stacks.js/post-conditions): Comprendiendo las post-condiciones.
+:::
diff --git a/content/docs/es/reference/stacks.js/(local-accounts)/contract-calls.mdx b/content/docs/es/reference/stacks.js/(local-accounts)/contract-calls.mdx
new file mode 100644
index 000000000..68c881139
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(local-accounts)/contract-calls.mdx
@@ -0,0 +1,224 @@
+---
+title: Llamadas de contrato
+description: Ejecutar funciones de contratos inteligentes con transacciones
+---
+Las llamadas de contrato te permiten ejecutar funciones que cambian el estado en contratos inteligentes. A diferencia de las llamadas de solo lectura, estas crean transacciones que deben ser firmadas y transmitidas a la red.
+
+## Llamada básica a contrato
+
+Ejecuta una función simple de contrato creando una transacción con los parámetros requeridos.
+
+```typescript
+import {
+ makeContractCall,
+ broadcastTransaction,
+ AnchorMode
+} from '@stacks/transactions';
+
+async function callContract() {
+ const txOptions = {
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'my-contract',
+ functionName: 'transfer',
+ functionArgs: [],
+ senderKey: 'your-private-key',
+ network: 'testnet',
+ anchorMode: AnchorMode.Any,
+ };
+
+ const transaction = await makeContractCall(txOptions);
+ const broadcastResponse = await broadcastTransaction({ transaction });
+
+ console.log('Transaction ID:', broadcastResponse.txid);
+}
+```
+
+El `makeContractCall` La función crea una transacción que ejecutará la función especificada cuando se confirme en la cadena.
+
+## Pasando argumentos de función
+
+La mayoría de las funciones de contrato requieren argumentos. Utiliza los constructores de valores de Clarity para coincidir con los tipos de parámetros esperados.
+
+```typescript
+import {
+ Cl,
+ makeContractCall,
+} from '@stacks/transactions';
+
+const functionArgs = [
+ Cl.principal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG'), // recipient
+ Cl.uint(1000000), // amount
+ Cl.buffer(Buffer.from('Transfer memo', 'utf-8')), // memo
+];
+
+const txOptions = {
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'sip-010-token',
+ functionName: 'transfer',
+ functionArgs,
+ senderKey: 'your-private-key',
+ network: "testnet",
+};
+
+const transaction = await makeContractCall(txOptions);
+const result = await broadcastTransaction({ transaction });
+console.log('Transaction ID:', result.txid);
+```
+
+Cada tipo de Clarity tiene una función constructora correspondiente que garantiza la codificación adecuada para la blockchain.
+
+### Tipos de argumentos complejos
+
+```typescript
+// Tuple arguments
+const userInfo = Cl.tuple({
+ name: Cl.string('Alice'),
+ age: Cl.uint(30),
+ active: Cl.bool(true),
+});
+
+// List arguments
+const addresses = Cl.list([
+ Cl.principal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),
+ Cl.principal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG'),
+]);
+
+```
+
+Los valores opcionales y de respuesta tienen constructores dedicados para una adecuada seguridad de tipos.
+
+```typescript
+// Optional values
+const optionalValue = Cl.some(Cl.uint(42)); // (some 42)
+const noValue = Cl.none(); // none
+
+// Response values
+const successResponse = Cl.ok(Cl.uint(100));
+const errorResponse = Cl.err(Cl.uint(404));
+```
+
+## Llamada de contrato con transferencia de STX
+
+Algunos contratos requieren que se envíen STX junto con la llamada a la función, como al acuñar NFTs o pagar por servicios.
+
+```typescript
+async function mintNFT() {
+ const mintPrice = 1000000; // 1 STX
+
+ const txOptions = {
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'nft-collection',
+ functionName: 'mint',
+ functionArgs: [],
+ senderKey: 'your-private-key',
+ network: new StacksTestnet(),
+ anchorMode: AnchorMode.Any,
+ // Attach STX to the contract call
+ amount: mintPrice,
+ };
+
+ const transaction = await makeContractCall(txOptions);
+ return broadcastTransaction(transaction, network);
+}
+```
+
+## Manejo de respuestas de contratos
+
+Procesar resultados de transacciones y respuestas de contratos:
+
+```typescript
+async function executeAndMonitor() {
+ // Execute contract call
+ const transaction = await makeContractCall({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'my-contract',
+ functionName: 'process',
+ functionArgs: [uintCV(100)],
+ senderKey: 'your-private-key',
+ network: new StacksTestnet(),
+ anchorMode: AnchorMode.Any,
+ });
+
+ const broadcastResponse = await broadcastTransaction(transaction, network);
+ const txId = broadcastResponse.txid;
+
+ // Wait for confirmation
+ const txInfo = await waitForConfirmation(txId, network);
+
+ // Check transaction result
+ if (txInfo.tx_status === 'success') {
+ console.log('Contract returned:', txInfo.tx_result);
+ // Parse the result based on expected return type
+ } else {
+ console.error('Transaction failed:', txInfo.tx_result);
+ }
+}
+
+async function waitForConfirmation(txId: string, network: StacksNetwork) {
+ let attempts = 0;
+ const maxAttempts = 30;
+
+ while (attempts < maxAttempts) {
+ const response = await fetch(
+ `${network.coreApiUrl}/extended/v1/tx/${txId}`
+ );
+ const txInfo = await response.json();
+
+ if (txInfo.tx_status === 'success' || txInfo.tx_status === 'abort_by_response') {
+ return txInfo;
+ }
+
+ await new Promise(resolve => setTimeout(resolve, 10000));
+ attempts++;
+ }
+
+ throw new Error('Transaction confirmation timeout');
+}
+```
+
+## Interacciones de contrato de múltiples pasos
+
+Encadena múltiples llamadas a contratos:
+
+```typescript
+async function complexWorkflow() {
+ // Step 1: Approve spending
+ const approveTx = await makeContractCall({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'token',
+ functionName: 'approve',
+ functionArgs: [
+ standardPrincipalCV('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG'),
+ uintCV(1000000),
+ ],
+ senderKey: 'your-private-key',
+ network: new StacksTestnet(),
+ anchorMode: AnchorMode.Any,
+ });
+
+ const approveResult = await broadcastTransaction(approveTx, network);
+ await waitForConfirmation(approveResult.txid, network);
+
+ // Step 2: Execute swap after approval
+ const swapTx = await makeContractCall({
+ contractAddress: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ contractName: 'dex',
+ functionName: 'swap-tokens',
+ functionArgs: [
+ standardPrincipalCV('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),
+ uintCV(1000000),
+ ],
+ senderKey: 'your-private-key',
+ network: new StacksTestnet(),
+ anchorMode: AnchorMode.Any,
+ });
+
+ return broadcastTransaction(swapTx, network);
+}
+```
+
+## Lecturas adicionales
+
+* [Despliegue de contratos](/reference/stacks.js/contract-deployment)
+* [Llamadas de solo lectura](/reference/stacks.js/read-only-calls)
+* [Postcondiciones](/reference/stacks.js/post-conditions)
diff --git a/content/docs/es/reference/stacks.js/(local-accounts)/contract-deployment.mdx b/content/docs/es/reference/stacks.js/(local-accounts)/contract-deployment.mdx
new file mode 100644
index 000000000..4c0bcead2
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(local-accounts)/contract-deployment.mdx
@@ -0,0 +1,44 @@
+---
+title: Despliegue de contratos
+description: Implementa contratos inteligentes en la cadena de bloques de Stacks
+---
+## Visión general
+
+El despliegue de contratos crea nuevos contratos inteligentes en la blockchain. Stacks.js proporciona herramientas para compilar, desplegar y verificar contratos de Clarity de forma programática. Los despliegues pueden ser contratos individuales simples o sistemas complejos de múltiples contratos con dependencias.
+
+## Despliegue básico de contratos
+
+Despliegue un contrato inteligente simple:
+
+```typescript
+import {
+ makeContractDeploy,
+ broadcastTransaction,
+ AnchorMode
+} from '@stacks/transactions';
+import { STACKS_TESTNET } from '@stacks/network';
+import { readFileSync } from 'fs';
+
+async function deployContract() {
+ const network = new StacksTestnet();
+
+ // Read contract source code
+ const contractSource = readFileSync('./contracts/my-contract.clar', 'utf-8');
+
+ const txOptions = {
+ contractName: 'my-contract',
+ codeBody: contractSource,
+ senderKey: 'your-private-key',
+ network,
+ anchorMode: AnchorMode.Any,
+ fee: 10000, // Higher fee for deployment
+ };
+
+ const transaction = await makeContractDeploy(txOptions);
+ const broadcastResponse = await broadcastTransaction(transaction, network);
+
+ console.log('Contract deployed!');
+ console.log('Transaction ID:', broadcastResponse.txid);
+ console.log('Contract address:', `${senderAddress}.${txOptions.contractName}`);
+}
+```
diff --git a/content/docs/es/reference/stacks.js/(local-accounts)/read-only-calls.mdx b/content/docs/es/reference/stacks.js/(local-accounts)/read-only-calls.mdx
new file mode 100644
index 000000000..74ec6cbb6
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(local-accounts)/read-only-calls.mdx
@@ -0,0 +1,113 @@
+---
+title: Llamadas de solo lectura
+description: Consultar el estado del contrato inteligente sin crear transacciones
+---
+Las llamadas a funciones de solo lectura te permiten consultar datos de contratos inteligentes sin crear una transacción. Estas llamadas son gratuitas, instantáneas y no requieren interacción con la billetera.
+
+## Llamada básica de solo lectura
+
+Llama a una función de solo lectura para obtener datos del contrato sin ninguna tarifa de transacción:
+
+```typescript
+import { fetchCallReadOnlyFunction, cvToValue } from '@stacks/transactions';
+
+const contractAddress = 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM';
+const contractName = 'my-contract';
+const functionName = 'get-balance';
+
+const response = await fetchCallReadOnlyFunction({
+ contractAddress,
+ contractName,
+ functionName,
+ functionArgs: [],
+ senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+});
+
+const balance = cvToValue(response);
+console.log('Balance:', balance);
+```
+
+## Pasando argumentos de función
+
+La mayoría de las funciones de solo lectura requieren argumentos. Utiliza los constructores de valores de Clarity para construir los tipos apropiados:
+
+```typescript
+import {
+ fetchCallReadOnlyFunction,
+ principalCV,
+ uintCV,
+ stringUtf8CV
+} from '@stacks/transactions';
+
+const functionArgs = [
+ principalCV('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),
+ stringUtf8CV('admin')
+];
+
+const response = await fetchCallReadOnlyFunction({
+ contractAddress: 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG',
+ contractName: 'access-control',
+ functionName: 'has-role',
+ functionArgs,
+ senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+});
+
+const hasRole = cvToValue(response);
+console.log('Has admin role:', hasRole);
+```
+
+## Manejo de tipos de respuesta
+
+Las funciones de solo lectura pueden devolver tipos de respuesta (ok/err). Verifica el tipo de respuesta para manejar tanto los casos de éxito como los de error:
+
+```typescript
+import {
+ fetchCallReadOnlyFunction,
+ cvToJSON,
+ ResponseOkCV,
+ ResponseErrorCV
+} from '@stacks/transactions';
+
+const response = await fetchCallReadOnlyFunction({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'sip-010-token',
+ functionName: 'get-token-info',
+ functionArgs: [],
+ senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+});
+
+if (response.type === 'ok') {
+ const tokenInfo = cvToJSON(response.value);
+ console.log('Token info:', tokenInfo);
+ // {
+ // name: "My Token",
+ // symbol: "MTK",
+ // decimals: 6,
+ // totalSupply: "1000000000000"
+ // }
+} else {
+ console.error('Error:', cvToValue(response.value));
+}
+```
+
+## Uso de red personalizada
+
+Especifique una URL de red personalizada para conexiones de testnet o nodos personalizados:
+
+```typescript
+import { fetchCallReadOnlyFunction } from '@stacks/transactions';
+
+const response = await fetchCallReadOnlyFunction({
+ contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ contractName: 'my-contract',
+ functionName: 'get-data',
+ functionArgs: [],
+ senderAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ network: 'testnet', // or custom URL like 'http://localhost:3999'
+});
+```
+
+## Lecturas adicionales
+
+* [Ejecutar funciones de contrato que cambian el estado](/reference/stacks.js/contract-calls)
+* [Trabajar con valores y tipos de Clarity](/reference/stacks.js/encoding-decoding)
diff --git a/content/docs/es/reference/stacks.js/(overview)/accounts-and-addresses.mdx b/content/docs/es/reference/stacks.js/(overview)/accounts-and-addresses.mdx
new file mode 100644
index 000000000..66c034d26
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(overview)/accounts-and-addresses.mdx
@@ -0,0 +1,178 @@
+---
+title: Cuentas y direcciones
+description: Aprende cómo obtener una dirección a partir de una cuenta
+---
+Stacks utiliza el concepto de una "cuenta" para representar la identidad de un usuario en la blockchain. Una cuenta se identifica mediante una dirección única derivada de la clave pública de la cuenta.
+
+## Formatos de dirección
+
+Las direcciones de Stacks utilizan diferentes prefijos para indicar la red a la que pertenecen, lo que facilita distinguir entre direcciones de mainnet y testnet.
+
+```typescript
+// Mainnet address starts with 'SP'
+const mainnetAddress = 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159';
+
+// Testnet address starts with 'ST'
+const testnetAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';
+```
+
+El formato de dirección garantiza que los tokens en la red de pruebas no puedan enviarse accidentalmente a direcciones de la red principal y viceversa.
+
+## Obtener una dirección
+
+Existen varias formas de obtener una dirección de Stacks dependiendo de tu caso de uso y del material criptográfico que tengas disponible.
+
+### Uso de Stacks Connect
+
+Al crear aplicaciones orientadas al usuario, normalmente obtendrás direcciones de usuarios que conectan sus billeteras a través de Stacks Connect.
+
+```tsx
+import { connect, getLocalStorage, request } from '@stacks/connect';
+
+async function handleWalletConnection() {
+ // Connect to wallet
+ const response = await connect();
+
+ // Get stored addresses
+ const data = getLocalStorage();
+ const stxAddresses = data.addresses.stx;
+
+ if (stxAddresses && stxAddresses.length > 0) {
+ const address = stxAddresses[0].address;
+ console.log('STX Address:', address);
+ // 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'
+ }
+
+ // Get detailed account info if needed
+ const accounts = await request('stx_getAccounts');
+ console.log('Account details:', accounts.addresses[0]);
+}
+```
+
+Stacks Connect almacena las direcciones conectadas en el almacenamiento local, permitiendo que tu aplicación mantenga la conexión a través de recargas de página.
+
+### Uso de una frase semilla
+
+Para la generación programática de billeteras o al restaurar cuentas desde una copia de seguridad, puedes derivar direcciones a partir de una frase semilla (también conocida como mnemotécnica).
+
+```typescript
+import { generateWallet, generateSecretKey } from '@stacks/wallet-sdk';
+
+async function createWalletFromSeed() {
+ // Generate a new 24-word seed phrase
+ const secretKey = generateSecretKey();
+
+ // Or use an existing seed phrase
+ // const secretKey = 'already owned seed phrase ...';
+
+ const wallet = await generateWallet({
+ secretKey,
+ password: 'optional-encryption-password',
+ });
+
+ // Get the first account's address
+ const account = wallet.accounts[0];
+ const mainnetAddress = account.address;
+
+ console.log('Address:', mainnetAddress);
+ console.log('Private key:', account.stxPrivateKey);
+}
+```
+
+Cada billetera puede contener múltiples cuentas, todas derivadas de la misma frase semilla utilizando diferentes rutas de derivación.
+
+### Uso de una clave privada
+
+Si ya tienes una clave privada, puedes derivar directamente la dirección correspondiente sin pasar por el proceso de generación de billetera.
+
+```typescript
+import { privateKeyToAddress, TransactionVersion } from '@stacks/transactions';
+
+function getAddressFromPrivateKey() {
+ // Compressed private key (64 or 66 characters)
+ const privateKey = 'your-private-key-here';
+
+ // For mainnet
+ const mainnetAddress = privateKeyToAddress(
+ privateKey,
+ TransactionVersion.Mainnet
+ );
+
+ // For testnet
+ const testnetAddress = privateKeyToAddress(
+ privateKey,
+ TransactionVersion.Testnet
+ );
+
+ console.log('Mainnet:', mainnetAddress);
+ console.log('Testnet:', testnetAddress);
+}
+```
+
+La misma clave privada generará diferentes direcciones para la red principal y la red de pruebas debido a los bytes de versión específicos de cada red.
+
+### Uso de una clave pública
+
+Cuando solo tienes acceso a una clave pública (por ejemplo, en un escenario de billetera de solo visualización), aún puedes derivar la dirección correspondiente.
+
+```typescript
+import { publicKeyToAddress, TransactionVersion } from '@stacks/transactions';
+
+function getAddressFromPublicKey() {
+ // Compressed public key (66 characters starting with 02 or 03)
+ const publicKey = '03b3e0a76b292b2c83fc0ac14ae6160d0438ebe94e14bbb7d0ded3c217f3d29ba7';
+
+ // For mainnet
+ const mainnetAddress = publicKeyToAddress(
+ publicKey,
+ TransactionVersion.Mainnet
+ );
+
+ // For testnet
+ const testnetAddress = publicKeyToAddress(
+ publicKey,
+ TransactionVersion.Testnet
+ );
+
+ console.log('Mainnet:', mainnetAddress);
+ // 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'
+}
+```
+
+Esto es útil para crear billeteras de solo visualización o verificar direcciones sin acceso a las claves privadas.
+
+## Validación de dirección
+
+Antes de enviar transacciones, es importante validar que las direcciones estén correctamente formateadas.
+
+```typescript
+import { validateStacksAddress } from '@stacks/transactions';
+
+function isValidAddress(address: string): boolean {
+ try {
+ // Check if it's a valid mainnet address
+ if (address.startsWith('SP')) {
+ return validateStacksAddress(address);
+ }
+
+ // Check if it's a valid testnet address
+ if (address.startsWith('ST')) {
+ return validateStacksAddress(address);
+ }
+
+ return false;
+ } catch (error) {
+ return false;
+ }
+}
+
+// Examples
+console.log(isValidAddress('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159')); // true
+console.log(isValidAddress('invalid-address')); // false
+```
+
+Siempre verifique las direcciones antes de usarlas en transacciones para evitar la pérdida de fondos debido a errores tipográficos o de formato.
+
+## Lecturas adicionales
+
+* [Conectar billetera](/reference/stacks.js/connect-wallet)
diff --git a/content/docs/es/reference/stacks.js/(overview)/networks.mdx b/content/docs/es/reference/stacks.js/(overview)/networks.mdx
new file mode 100644
index 000000000..ebeb71d17
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(overview)/networks.mdx
@@ -0,0 +1,53 @@
+---
+title: Redes
+description: Aprende a utilizar diferentes redes.
+---
+import { Star } from 'lucide-react';
+
+Típicamente, hablamos de `mainnet` y `testnet` como las redes de Stacks.
+La mayoría de las billeteras están configuradas para `mainnet` por defecto—este es el entorno de producción, la blockchain real que contiene tokens STX reales.
+
+Como su nombre indica, `testnet` es una red pública para pruebas.
+Es un estado de blockchain separado que contiene tokens de prueba, los cuales no tienen valor.
+
+Por completitud también mencionamos `devnet`.
+Esto no es "una" red, sino cómo los desarrolladores se refieren a redes locales efímeras utilizadas para pruebas.
+Es lo mismo que `testnet`, pero para desarrollo local.
+[Más información](/tools/clarinet/local-blockchain-development).
+
+## Configurando la red
+
+La mayoría de las funciones de Stacks.js aceptan un `network` parámetro o un último argumento opcional.
+
+El `network` type es una cadena de texto y puede ser uno de los siguientes:
+
+* `'mainnet'` (predeterminado)
+* `'testnet'`
+* `'devnet'`
+* `'mocknet'` (alias de `devnet`)
+
+### Ejemplos
+
+Red en la firma de transacciones:
+
+```ts
+const tx = makeSTXTokenTransfer({
+ // ...
+ network: 'testnet',
+});
+```
+
+Red en la derivación de direcciones:
+
+```ts
+const address = privateKeyToAddress(privateKey, 'devnet');
+// ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP
+```
+
+:::callout
+type: tip
+
+### Uso avanzado
+
+Para usos más avanzados, puedes pasar un objeto de configuración de red. Lee más sobre el objeto de red en el [`@stacks/network`](/reference/stacks.js/packages/network) paquete.
+:::
diff --git a/content/docs/es/reference/stacks.js/(overview)/private-keys.mdx b/content/docs/es/reference/stacks.js/(overview)/private-keys.mdx
new file mode 100644
index 000000000..b4809b786
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(overview)/private-keys.mdx
@@ -0,0 +1,178 @@
+---
+title: Claves privadas
+description: Aprende cómo gestionar claves privadas con Stacks.js
+---
+Las aplicaciones de Stacks pueden funcionar con dos tipos diferentes de cuentas: billeteras web (como Hiro Wallet o Xverse) que los usuarios controlan, o cuentas locales de las que gestionas directamente las claves privadas.
+
+## Monederos web (controlados por el usuario)
+
+La mayoría de los usuarios interactúan con las aplicaciones de Stacks a través de billeteras web, donde la billetera maneja toda la gestión de claves privadas y la firma de transacciones.
+
+```typescript
+import { connect } from '@stacks/connect';
+
+// Users connect their wallet
+const response = await connect();
+console.log('Connected addresses:', response.addresses);
+
+// The wallet handles all cryptographic operations
+// when signing transactions or messages
+```
+
+Utilice billeteras web al crear aplicaciones orientadas al usuario donde los usuarios deben mantener el control de sus claves.
+
+## Cuentas locales (controladas por la aplicación)
+
+Las cuentas locales otorgan a tu aplicación control directo sobre las claves privadas, permitiendo la firma programática de transacciones sin interacción del usuario.
+
+```typescript
+import { makeSTXTokenTransfer } from '@stacks/transactions';
+
+// Your application controls the private key
+const privateKey = 'your-private-key-here';
+
+const txOptions = {
+ recipient: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ amount: 1000000n,
+ senderKey: privateKey, // Direct private key usage
+ network: 'testnet',
+};
+
+const transaction = await makeSTXTokenTransfer(txOptions);
+// Transaction is signed programmatically
+```
+
+Utilice cuentas locales para servicios backend, sistemas automatizados o herramientas de desarrollo que necesiten firmar transacciones sin interacción del usuario.
+
+## Trabajando con claves privadas
+
+Al crear aplicaciones que utilizan cuentas locales, necesitarás generar y gestionar claves privadas de forma segura.
+
+### Generando claves privadas aleatorias
+
+Crea una nueva clave privada para uso único o con fines de prueba.
+
+```typescript
+import { randomPrivateKey } from '@stacks/transactions';
+
+function generateNewAccount() {
+ const privateKey = randomPrivateKey();
+ console.log('Private key:', privateKey);
+ // 'f5a31c1268a1e37d4edaa05c7d11183c5fbf...'
+
+ // IMPORTANT: Store this securely!
+ // Anyone with this key can control the account
+ return privateKey;
+}
+```
+
+Las claves privadas en Stacks son números de 256 bits, generalmente representados como cadenas hexadecimales de 64 caracteres.
+
+## Formatos de clave privada
+
+Stacks.js admite múltiples formatos de clave privada para diferentes casos de uso.
+
+```typescript
+import { PrivateKey } from '@stacks/transactions';
+
+// Hex string format (most common)
+const hexKey = 'f5a31c1268a1e37d4edaa05c7d11183c5fbf...';
+
+// Compressed format with suffix
+const compressedKey = 'f5a31c1268a1e37d4edaa05c7d11183c5fbf...01';
+
+// Create from raw bytes
+const bytes = new Uint8Array(32); // 32 bytes = 256 bits
+crypto.getRandomValues(bytes);
+const privateKeyFromBytes = PrivateKey.fromBytes(bytes);
+```
+
+El formato comprimido incluye un byte de sufijo (01) que indica que la clave debe usar codificación de clave pública comprimida.
+
+## Generación de billetera con frases semilla
+
+Para una mejor seguridad y recuperabilidad, utiliza carteras determinísticas jerárquicas (HD) basadas en frases semilla.
+
+### Generar una frase semilla
+
+Crea una nueva frase semilla mnemónica de 24 palabras que pueda regenerar todas las cuentas de la billetera.
+
+```typescript
+import { generateSecretKey } from '@stacks/wallet-sdk';
+
+function createNewWallet() {
+ const secretKey = generateSecretKey();
+ console.log('Seed phrase:', secretKey);
+ // "warrior volume sport ... figure cake since"
+
+ // Users should write this down and store it securely
+ // This phrase can regenerate all accounts in the wallet
+ return secretKey;
+}
+```
+
+Las frases semilla proporcionan una copia de seguridad legible por humanos que puede restaurar toda una jerarquía de billeteras.
+
+### Crear billetera a partir de frase semilla
+
+Generar una estructura completa de billetera a partir de una frase semilla, incluyendo múltiples cuentas.
+
+```typescript
+import { generateWallet, generateSecretKey } from '@stacks/wallet-sdk';
+
+async function setupWallet() {
+ // Use existing seed phrase or generate new one
+ const seedPhrase = generateSecretKey();
+
+ const wallet = await generateWallet({
+ secretKey: seedPhrase,
+ password: 'optional-encryption-password',
+ });
+
+ // Access the first account
+ const account = wallet.accounts[0];
+ console.log('STX address:', account.address);
+ console.log('STX private key:', account.stxPrivateKey);
+ console.log('Data private key:', account.dataPrivateKey);
+
+ return wallet;
+}
+```
+
+Cada billetera puede contener múltiples cuentas, todas derivadas de la misma frase semilla pero con diferentes claves privadas.
+
+### Administración de múltiples cuentas
+
+Las billeteras HD admiten múltiples cuentas a partir de una sola frase semilla, útil para organizar fondos o separar asuntos.
+
+```typescript
+import { generateNewAccount, generateWallet, generateSecretKey } from '@stacks/wallet-sdk';
+
+async function createMultipleAccounts() {
+ const seedPhrase = generateSecretKey();
+
+ let wallet = await generateWallet({
+ secretKey: seedPhrase,
+ password: 'my-password',
+ });
+
+ console.log('Accounts:', wallet.accounts.length); // 1 (default)
+
+ // Add more accounts
+ wallet = generateNewAccount(wallet);
+ wallet = generateNewAccount(wallet);
+
+ console.log('Accounts:', wallet.accounts.length); // 3
+
+ // Each account has its own keys and address
+ wallet.accounts.forEach((account, index) => {
+ console.log(`Account ${index}:`, account.address);
+ });
+}
+```
+
+Todas las cuentas pueden regenerarse a partir de la frase semilla original, lo que simplifica la copia de seguridad mientras se mantienen direcciones separadas.
+
+## Lecturas adicionales
+
+* [Conectar con Stacks](/reference/stacks.js/connect-wallet) - Creando aplicaciones con billeteras web
diff --git a/content/docs/es/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx b/content/docs/es/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
new file mode 100644
index 000000000..afdfd955f
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx
@@ -0,0 +1,246 @@
+---
+title: Implementando post-condiciones
+sidebarTitle: Implementar post-condiciones
+description: Aprende cómo agregar post-condiciones para proteger tus transacciones de Stacks
+---
+Las post-condiciones son una poderosa característica de seguridad en Stacks que protege a los usuarios de resultados inesperados en las transacciones. Este tutorial te guiará a través de la implementación de post-condiciones en tus aplicaciones para garantizar que las transacciones se comporten exactamente como los usuarios esperan.
+
+## Lo que aprenderás
+
+:::objectives
+* Construir post-condiciones utilizando la API auxiliar Pc
+* Agregar post-condiciones a diferentes tipos de transacciones
+* Configurar modos de post-condición para la seguridad de las transacciones
+* Implementar post-condiciones para STX, tokens fungibles y NFTs
+* Manejar tokens semi-fungibles (SFTs) con post-condiciones
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Comprensión básica de las transacciones de Stacks
+* Biblioteca Stacks.js instalada (`npm install @stacks/transactions`)
+* Un entorno de desarrollo configurado para Stacks
+:::
+
+## Construyendo post-condiciones
+
+El ayudante Pc en Stacks.js proporciona una API fluida inspirada en BDD para construir post-condiciones. Comienza con `Pc.principal()` para especificar qué dirección será verificada, luego encadene métodos para definir la condición.
+
+```ts
+import { Pc } from '@stacks/transactions';
+
+// Basic structure of a post-condition
+const postCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendEq(1000)
+ .ustx();
+```
+
+El ayudante de PC utiliza encadenamiento de métodos para una construcción intuitiva de condiciones. Su IDE proporcionará autocompletado para los métodos disponibles en cada paso.
+
+## Métodos de transferencia disponibles
+
+Las post-condiciones admiten diferentes operadores de comparación y tipos de activos. Elija el método apropiado según sus requisitos de seguridad.
+
+### Métodos de STX y tokens fungibles
+
+```ts
+// Exact amount
+Pc.principal(address).willSendEq(1000).ustx();
+
+// Greater than or equal
+Pc.principal(address).willSendGte(500).ustx();
+
+// Less than
+Pc.principal(address).willSendLt(2000).ustx();
+```
+
+Métodos de comparación disponibles:
+
+* `.willSendEq(amount)` - Exactamente igual al monto
+* `.willSendGte(amount)` - Mayor o igual que la cantidad
+* `.willSendGt(amount)` - Mayor que la cantidad
+* `.willSendLte(amount)` - Menor o igual a la cantidad
+* `.willSendLt(amount)` - Menos que la cantidad
+
+### Métodos de tipos de activos
+
+```ts
+// STX transfers
+.ustx()
+
+// Fungible token transfers
+.ft(contractAddress, tokenName)
+
+// NFT transfers
+.nft(assetIdentifier, tokenId)
+```
+
+### Métodos específicos de NFT
+
+```ts
+// Ensure NFT is sent
+Pc.principal(address).willSendAsset().nft(...);
+
+// Ensure NFT is NOT sent
+Pc.principal(address).willNotSendAsset().nft(...);
+```
+
+## Configuración del modo de post-condición
+
+El modo de post-condición determina cómo la blockchain de Stacks maneja las transferencias de activos no cubiertas explícitamente por sus post-condiciones. Esta es una configuración de seguridad crítica.
+
+```ts
+import { PostConditionMode, makeContractCall } from '@stacks/transactions';
+
+const tx = await makeContractCall({
+ // ... other transaction properties
+ postConditionMode: PostConditionMode.Deny, // Recommended default
+ postConditions: [
+ // your post-conditions here
+ ],
+});
+```
+
+Opciones de modo:
+
+* **`PostConditionMode.Deny`** (default): La transacción falla si ocurre alguna transferencia no especificada
+* **`PostConditionMode.Allow`**: La transacción permite transferencias más allá de las condiciones posteriores especificadas
+
+## Patrones de implementación comunes
+
+### Condiciones posteriores a la transferencia de STX
+
+Proteja las transferencias de STX especificando cantidades exactas o rangos.
+
+```ts
+import { Pc, makeSTXTokenTransfer } from '@stacks/transactions';
+
+// Exact amount post-condition
+const exactAmountCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendEq(1000)
+ .ustx();
+
+// Use in a transaction
+const tx = await makeSTXTokenTransfer({
+ recipient: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ amount: 1000,
+ postConditions: [exactAmountCondition],
+ postConditionMode: PostConditionMode.Deny,
+ // ... other properties
+});
+```
+
+### Condiciones posteriores de tokens fungibles
+
+Asegúrese de que los tokens fungibles se transfieran según lo esperado en las llamadas de contrato.
+
+```ts
+import { Pc, makeContractCall } from '@stacks/transactions';
+
+// Minimum amount condition
+const ftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendGte(500)
+ .ft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft', 'token');
+
+// Use in a contract call
+const tx = await makeContractCall({
+ contractAddress: 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
+ contractName: 'token-transfer',
+ functionName: 'transfer',
+ functionArgs: [
+ // ... function arguments
+ ],
+ postConditions: [ftCondition],
+ // ... other properties
+});
+```
+
+### Condiciones posteriores a la transferencia de NFT
+
+Controla los cambios de propiedad de NFT con condiciones posteriores específicas.
+
+```ts
+import { Pc, Cl } from '@stacks/transactions';
+
+// Ensure NFT is sent
+const sendNftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendAsset()
+ .nft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.nft-contract::nft-name', Cl.uint(1));
+
+// Ensure NFT is NOT sent (protection against unwanted transfers)
+const keepNftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willNotSendAsset()
+ .nft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.nft-contract::nft-name', Cl.uint(1));
+```
+
+Usar `willNotSendAsset()` para proteger valiosos NFTs de ser transferidos inesperadamente.
+
+### Condiciones posteriores de token semi-fungible (SFT)
+
+Los SFT requieren un manejo especial ya que tienen propiedades tanto fungibles como no fungibles.
+
+```ts
+import { Cl, Pc } from '@stacks/transactions';
+
+// SFT as NFT (specific token ID)
+const sftNftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendAsset()
+ .nft(
+ 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sft-contract::sft-id',
+ Cl.tuple({
+ 'token-id': Cl.uint(1),
+ owner: Cl.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ })
+ );
+
+// SFT as FT (amount-based)
+const sftFtCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendEq(500)
+ .ft('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sft-contract', 'sft-token');
+```
+
+## Múltiples post-condiciones
+
+Las transacciones complejas a menudo requieren múltiples condiciones posteriores para proteger completamente todas las transferencias de activos.
+
+```ts
+const tx = await makeContractCall({
+ // ... transaction properties
+ postConditions: [
+ // Sender must send exactly 1000 uSTX
+ Pc.principal(senderAddress).willSendEq(1000).ustx(),
+
+ // Contract must send at least 100 tokens to user
+ Pc.principal(contractAddress).willSendGte(100)
+ .ft(contractAddress + '.my-token', 'my-token'),
+
+ // User must not lose their NFT
+ Pc.principal(senderAddress).willNotSendAsset()
+ .nft(nftContract + '::my-nft', Cl.uint(1)),
+ ],
+ postConditionMode: PostConditionMode.Deny,
+});
+```
+
+:::callout
+type: tip
+
+### Pruébalo
+
+Explora el [Plantilla de post-condiciones](https://platform.hiro.so) para ejemplos interactivos.
+:::
+
+## Próximos pasos
+
+:::next-steps
+* [Llamada de contrato](/reference/stacks.js/contract-calls): Aprende cómo llamar contratos en Stacks
+* [Transmisión de transacciones](/reference/stacks.js/broadcast-transactions): Aprende cómo transmitir transacciones protegidas
+:::
diff --git a/content/docs/es/reference/stacks.js/(post-conditions)/post-conditions.mdx b/content/docs/es/reference/stacks.js/(post-conditions)/post-conditions.mdx
new file mode 100644
index 000000000..93b853a7d
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(post-conditions)/post-conditions.mdx
@@ -0,0 +1,131 @@
+---
+title: Introducción
+sidebarTitle: Introducción
+description: Aprende cómo las post-condiciones protegen a los usuarios de resultados inesperados en las transacciones
+---
+Las post-condiciones son características de seguridad en Stacks que protegen a los usuarios al garantizar que las transacciones se ejecuten exactamente como se espera. Verifican que se produzcan transferencias específicas de activos durante una transacción, y si las condiciones no se cumplen, toda la transacción falla sin cambios de estado.
+
+## ¿Qué son las post-condiciones?
+
+Las post-condiciones actúan como salvaguardias que verifican que las transferencias de activos coincidan con tus expectativas. Pueden comprobar transferencias de STX, tokens fungibles y cambios de propiedad de tokens no fungibles.
+
+```ts
+import { Pc } from '@stacks/transactions';
+
+const tx = await makeContractCall({
+ // ...
+ postConditions: [
+ Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6').willSendEq(1000).ustx(),
+ ],
+});
+```
+
+Las post-condiciones solo verifican que los activos sean enviados, no recibidos. No pueden garantizar el destinatario final de los tokens.
+
+## Uso del asistente de PC
+
+El `Pc` helper proporciona una API fluida para crear post-condiciones con mejor seguridad de tipos y legibilidad.
+
+```ts
+import { Pc } from '@stacks/transactions';
+
+// STX transfer post-condition
+const stxCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendGte(1000)
+ .ustx();
+
+// Fungible token post-condition
+const ftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendEq(50)
+ .ft('SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-token', 'my-token');
+
+// NFT post-condition
+const nftCondition = Pc
+ .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
+ .willSendAsset()
+ .nft('SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset', Cl.uint(1));
+```
+
+## Creación manual
+
+Cree post-condiciones manualmente utilizando definiciones de tipo al construir condiciones dinámicamente.
+
+```ts
+import {
+ StxPostCondition,
+ FungiblePostCondition,
+ NonFungiblePostCondition
+} from '@stacks/transactions';
+
+// STX post-condition
+const stxPostCondition: StxPostCondition = {
+ type: 'stx-postcondition',
+ address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',
+ condition: 'gte', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'
+ amount: '100',
+};
+```
+
+Tipos de condiciones disponibles:
+
+* `eq`: Exactamente igual a la cantidad
+* `gt`: Mayor que cantidad
+* `gte`: Mayor o igual que cantidad
+* `lt`: Menos que cantidad
+* `lte`: Menor o igual que la cantidad
+
+### Tokens fungibles
+
+```ts
+const ftPostCondition: FungiblePostCondition = {
+ type: 'ft-postcondition',
+ address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',
+ condition: 'eq',
+ amount: '100',
+ asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',
+};
+```
+
+### Tokens no fungibles
+
+```ts
+const nftPostCondition: NonFungiblePostCondition = {
+ type: 'nft-postcondition',
+ address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',
+ condition: 'sent', // 'sent' | 'not-sent'
+ asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',
+ assetId: Cl.uint(602),
+};
+```
+
+## Modo de post-condición
+
+Controla cómo se manejan las transferencias de activos no especificadas con el modo de post-condición.
+
+```ts
+import { PostConditionMode } from '@stacks/transactions';
+
+const tx = await makeContractCall({
+ // ...
+ postConditionMode: PostConditionMode.Deny,
+ postConditions: [
+ // your conditions
+ ],
+});
+```
+
+:::callout
+type: warn
+
+### Modo de post-condición
+
+Siempre usa `Deny` modo a menos que tenga una razón específica para permitir transferencias adicionales. Esto proporciona la máxima seguridad para los usuarios.
+:::
+
+## Lecturas adicionales
+
+* [Implementando post-condiciones](/reference/stacks.js/implementing-post-conditions)
+* [Construcción de transacciones](/reference/stacks.js/build-transactions)
+* [Llamadas de contrato](/reference/stacks.js/contract-calls)
diff --git a/content/docs/es/reference/stacks.js/(utils)/address-validation.mdx b/content/docs/es/reference/stacks.js/(utils)/address-validation.mdx
new file mode 100644
index 000000000..94323b358
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(utils)/address-validation.mdx
@@ -0,0 +1,561 @@
+---
+title: Validación de direcciones
+description: Validar y formatear direcciones y principales de Stacks
+---
+## Visión general
+
+Las direcciones de Stacks siguen formatos específicos que difieren entre la red principal y la red de pruebas. Una validación adecuada garantiza que tu aplicación maneje correctamente las direcciones, evitando la pérdida de fondos y mejorando la experiencia del usuario. Esta guía cubre la validación de direcciones, el formateo y las utilidades de conversión.
+
+## Validación básica de direcciones
+
+Validar direcciones de Stacks:
+
+```typescript
+import {
+ validateStacksAddress,
+ validateContractName
+} from '@stacks/transactions';
+
+// Validate standard addresses
+const isValidMainnet = validateStacksAddress('SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY');
+console.log('Valid mainnet:', isValidMainnet); // true
+
+const isValidTestnet = validateStacksAddress('ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC');
+console.log('Valid testnet:', isValidTestnet); // true
+
+const isInvalid = validateStacksAddress('invalid-address');
+console.log('Valid:', isInvalid); // false
+
+// Validate contract names
+const validContract = validateContractName('my-contract');
+console.log('Valid contract name:', validContract); // true
+
+const invalidContract = validateContractName('My Contract!');
+console.log('Valid contract name:', invalidContract); // false
+```
+
+## Tipos de direcciones y detección
+
+Identificar tipos de direcciones y redes:
+
+```typescript
+import {
+ getAddressFromPrivateKey,
+ getAddressFromPublicKey,
+ TransactionVersion
+} from '@stacks/transactions';
+
+// Detect address type from prefix
+function getAddressInfo(address: string): {
+ type: 'standard' | 'contract' | 'multisig' | 'invalid';
+ network: 'mainnet' | 'testnet' | 'unknown';
+} {
+ if (!validateStacksAddress(address)) {
+ return { type: 'invalid', network: 'unknown' };
+ }
+
+ // Mainnet prefixes
+ if (address.startsWith('SP')) {
+ return { type: 'standard', network: 'mainnet' };
+ } else if (address.startsWith('SM')) {
+ return { type: 'multisig', network: 'mainnet' };
+ }
+
+ // Testnet prefixes
+ else if (address.startsWith('ST')) {
+ return { type: 'standard', network: 'testnet' };
+ } else if (address.startsWith('SN')) {
+ return { type: 'multisig', network: 'testnet' };
+ }
+
+ // Contract address (contains .)
+ if (address.includes('.')) {
+ const [principal] = address.split('.');
+ const info = getAddressInfo(principal);
+ return { ...info, type: 'contract' };
+ }
+
+ return { type: 'invalid', network: 'unknown' };
+}
+
+// Usage
+const info = getAddressInfo('SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY.my-contract');
+console.log(info); // { type: 'contract', network: 'mainnet' }
+```
+
+## Generación de direcciones
+
+Generar direcciones a partir de claves:
+
+```typescript
+import {
+ makeRandomPrivKey,
+ getPublicKey,
+ getAddressFromPrivateKey,
+ getAddressFromPublicKey,
+ TransactionVersion,
+ AddressHashMode
+} from '@stacks/transactions';
+
+// Generate new random address
+function generateNewAddress(network: 'mainnet' | 'testnet') {
+ const privateKey = makeRandomPrivKey();
+ const publicKey = getPublicKey(privateKey);
+
+ const version = network === 'mainnet'
+ ? TransactionVersion.Mainnet
+ : TransactionVersion.Testnet;
+
+ const address = getAddressFromPrivateKey(privateKey, version);
+
+ return {
+ privateKey,
+ publicKey,
+ address,
+ };
+}
+
+// Generate address from existing private key
+function getAddressFromKey(privateKey: string, network: 'mainnet' | 'testnet') {
+ const version = network === 'mainnet'
+ ? TransactionVersion.Mainnet
+ : TransactionVersion.Testnet;
+
+ return getAddressFromPrivateKey(privateKey, version);
+}
+
+// Generate multisig address
+function generateMultisigAddress(
+ publicKeys: string[],
+ signaturesRequired: number,
+ network: 'mainnet' | 'testnet'
+) {
+ const version = network === 'mainnet'
+ ? TransactionVersion.Mainnet
+ : TransactionVersion.Testnet;
+
+ const hashMode = AddressHashMode.SerializeP2SH;
+
+ // Implementation depends on multisig setup
+ // This is a simplified example
+ return getAddressFromPublicKey(
+ publicKeys[0], // Simplified - real implementation needs all keys
+ version,
+ hashMode
+ );
+}
+```
+
+## Manejo de direcciones de contrato
+
+Trabajar con directores de contrato:
+
+```typescript
+// Parse contract address components
+function parseContractAddress(contractAddress: string): {
+ principal: string;
+ contractName: string;
+ isValid: boolean;
+} {
+ const parts = contractAddress.split('.');
+
+ if (parts.length !== 2) {
+ return { principal: '', contractName: '', isValid: false };
+ }
+
+ const [principal, contractName] = parts;
+
+ const isValid = validateStacksAddress(principal) &&
+ validateContractName(contractName);
+
+ return { principal, contractName, isValid };
+}
+
+// Build contract address
+function buildContractAddress(principal: string, contractName: string): string {
+ if (!validateStacksAddress(principal)) {
+ throw new Error('Invalid principal address');
+ }
+
+ if (!validateContractName(contractName)) {
+ throw new Error('Invalid contract name');
+ }
+
+ return `${principal}.${contractName}`;
+}
+
+// Validate full contract identifier
+function validateContractAddress(address: string): boolean {
+ const { isValid } = parseContractAddress(address);
+ return isValid;
+}
+
+// Usage
+const parsed = parseContractAddress('SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY.my-token');
+console.log(parsed);
+// { principal: 'SP2J6...', contractName: 'my-token', isValid: true }
+```
+
+## Utilidades de conversión de direcciones
+
+Convertir entre formatos y redes:
+
+```typescript
+import { c32addressDecode, c32address } from 'c32check';
+
+// Convert between testnet and mainnet addresses
+function convertAddressNetwork(
+ address: string,
+ toNetwork: 'mainnet' | 'testnet'
+): string {
+ try {
+ // Decode the address
+ const decoded = c32addressDecode(address);
+
+ // Determine new version
+ let newVersion: number;
+ if (toNetwork === 'mainnet') {
+ newVersion = decoded[0] === 26 ? 22 : 20; // Multi-sig or standard
+ } else {
+ newVersion = decoded[0] === 22 ? 26 : 21; // Multi-sig or standard
+ }
+
+ // Re-encode with new version
+ const newAddress = c32address(newVersion, decoded[1]);
+ return newAddress;
+ } catch (error) {
+ throw new Error('Invalid address format');
+ }
+}
+
+// Extract address hash
+function getAddressHash(address: string): string {
+ const decoded = c32addressDecode(address);
+ return Buffer.from(decoded[1]).toString('hex');
+}
+
+// Check if addresses are same (ignoring network)
+function isSameAddress(addr1: string, addr2: string): boolean {
+ try {
+ const hash1 = getAddressHash(addr1);
+ const hash2 = getAddressHash(addr2);
+ return hash1 === hash2;
+ } catch {
+ return false;
+ }
+}
+```
+
+## Patrones de validación avanzados
+
+### Validador de direcciones completo
+
+Crea un sistema de validación robusto:
+
+```typescript
+class AddressValidator {
+ private cache = new Map();
+
+ validate(address: string, options?: {
+ network?: 'mainnet' | 'testnet';
+ allowContracts?: boolean;
+ allowMultisig?: boolean;
+ }): { valid: boolean; reason?: string } {
+ // Check cache
+ const cacheKey = `${address}-${JSON.stringify(options)}`;
+ if (this.cache.has(cacheKey)) {
+ return { valid: this.cache.get(cacheKey)! };
+ }
+
+ // Basic validation
+ if (!validateStacksAddress(address)) {
+ return { valid: false, reason: 'Invalid address format' };
+ }
+
+ const info = getAddressInfo(address);
+
+ // Check network if specified
+ if (options?.network && info.network !== options.network) {
+ return {
+ valid: false,
+ reason: `Address is for ${info.network}, expected ${options.network}`
+ };
+ }
+
+ // Check contract addresses
+ if (info.type === 'contract' && !options?.allowContracts) {
+ return { valid: false, reason: 'Contract addresses not allowed' };
+ }
+
+ // Check multisig
+ if (info.type === 'multisig' && !options?.allowMultisig) {
+ return { valid: false, reason: 'Multisig addresses not allowed' };
+ }
+
+ // Cache result
+ this.cache.set(cacheKey, true);
+
+ return { valid: true };
+ }
+
+ validateBatch(addresses: string[], options?: any): Map {
+ const results = new Map();
+
+ for (const address of addresses) {
+ const { valid } = this.validate(address, options);
+ results.set(address, valid);
+ }
+
+ return results;
+ }
+}
+```
+
+### Formato de dirección
+
+Formatear direcciones para mostrar:
+
+```typescript
+function formatAddress(
+ address: string,
+ options?: {
+ truncate?: boolean;
+ length?: number;
+ separator?: string;
+ }
+): string {
+ if (!validateStacksAddress(address)) {
+ return 'Invalid Address';
+ }
+
+ if (options?.truncate) {
+ const length = options.length || 8;
+ const start = address.slice(0, length);
+ const end = address.slice(-length);
+ const separator = options.separator || '...';
+ return `${start}${separator}${end}`;
+ }
+
+ return address;
+}
+
+// Format for display with copy functionality
+function AddressDisplay({ address }: { address: string }) {
+ const [copied, setCopied] = useState(false);
+
+ const formatted = formatAddress(address, {
+ truncate: true,
+ length: 6
+ });
+
+ const copyToClipboard = () => {
+ navigator.clipboard.writeText(address);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ };
+
+ return (
+
+ {formatted}
+ {copied && ✓ Copied }
+
+ );
+}
+```
+
+## Ganchos de validación de entrada
+
+Hooks de React para entradas de direcciones:
+
+```typescript
+import { useState, useCallback } from 'react';
+
+function useAddressInput(options?: {
+ network?: 'mainnet' | 'testnet';
+ allowContracts?: boolean;
+}) {
+ const [value, setValue] = useState('');
+ const [error, setError] = useState(null);
+ const [isValid, setIsValid] = useState(false);
+
+ const validate = useCallback((address: string) => {
+ if (!address) {
+ setError(null);
+ setIsValid(false);
+ return;
+ }
+
+ const validator = new AddressValidator();
+ const result = validator.validate(address, options);
+
+ setError(result.reason || null);
+ setIsValid(result.valid);
+ }, [options]);
+
+ const handleChange = useCallback((newValue: string) => {
+ setValue(newValue);
+ validate(newValue);
+ }, [validate]);
+
+ return {
+ value,
+ error,
+ isValid,
+ setValue: handleChange,
+ validate,
+ };
+}
+
+// Usage in component
+function AddressInput() {
+ const address = useAddressInput({
+ network: 'mainnet',
+ allowContracts: false
+ });
+
+ return (
+
+ address.setValue(e.target.value)}
+ placeholder="Enter Stacks address"
+ className={address.error ? 'error' : ''}
+ />
+ {address.error && (
+ {address.error}
+ )}
+
+ );
+}
+```
+
+## Consideraciones de seguridad
+
+Implementar manejo seguro de direcciones:
+
+```typescript
+// Sanitize user input
+function sanitizeAddress(input: string): string {
+ // Remove whitespace and common separators
+ return input.trim().replace(/[\s\-_]/g, '');
+}
+
+// Verify address ownership
+async function verifyAddressOwnership(
+ address: string,
+ signature: string,
+ message: string
+): Promise {
+ try {
+ // Verify the signature matches the address
+ const verified = verifyMessageSignature({
+ message,
+ signature,
+ publicKey: await getPublicKeyFromAddress(address),
+ });
+
+ return verified;
+ } catch {
+ return false;
+ }
+}
+
+// Validate address for specific use case
+function validateRecipientAddress(
+ address: string,
+ options: {
+ blockList?: string[];
+ allowList?: string[];
+ requireMainnet?: boolean;
+ }
+): { valid: boolean; reason?: string } {
+ // Check blocklist
+ if (options.blockList?.includes(address)) {
+ return { valid: false, reason: 'Address is blocked' };
+ }
+
+ // Check allowlist
+ if (options.allowList && !options.allowList.includes(address)) {
+ return { valid: false, reason: 'Address not in allowlist' };
+ }
+
+ // Check network
+ const info = getAddressInfo(address);
+ if (options.requireMainnet && info.network !== 'mainnet') {
+ return { valid: false, reason: 'Mainnet address required' };
+ }
+
+ return { valid: true };
+}
+```
+
+## Utilidades de prueba
+
+Prueba de validación de dirección:
+
+```typescript
+import { describe, it, expect } from 'vitest';
+
+describe('Address validation', () => {
+ const validAddresses = [
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY',
+ 'ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC',
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY.my-contract',
+ ];
+
+ const invalidAddresses = [
+ 'invalid',
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZ', // Too short
+ 'XP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY', // Wrong prefix
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY.', // Missing contract
+ ];
+
+ validAddresses.forEach(address => {
+ it(`should validate ${address}`, () => {
+ expect(validateStacksAddress(address)).toBe(true);
+ });
+ });
+
+ invalidAddresses.forEach(address => {
+ it(`should reject ${address}`, () => {
+ expect(validateStacksAddress(address)).toBe(false);
+ });
+ });
+});
+```
+
+## Mejores prácticas
+
+* **Siempre valide la entrada del usuario**: Nunca confíes en las direcciones proporcionadas por los usuarios
+* **Comprobar la compatibilidad de la red**: Asegúrate de que las direcciones coincidan con tu red
+* **Manejar casos extremos**: Direcciones de contrato, multifirma, etc.
+* **Resultados de validación de caché**: Evitar validación redundante
+* **Proporcionar mensajes de error claros**: Ayuda a los usuarios a corregir entradas inválidas
+
+## Errores comunes
+
+**No comprobar el tipo de red**
+
+```typescript
+// Bad: Accepting any valid address
+const isValid = validateStacksAddress(userInput);
+
+// Good: Checking network matches
+const info = getAddressInfo(userInput);
+if (info.network !== 'mainnet') {
+ throw new Error('Please use a mainnet address');
+}
+```
+
+**Suponiendo el formato de dirección**
+
+```typescript
+// Bad: Assuming standard address
+const [principal, contract] = address.split('.');
+
+// Good: Proper validation
+const parsed = parseContractAddress(address);
+if (!parsed.isValid) {
+ throw new Error('Invalid contract address');
+}
+```
diff --git a/content/docs/es/reference/stacks.js/(utils)/encoding-decoding.mdx b/content/docs/es/reference/stacks.js/(utils)/encoding-decoding.mdx
new file mode 100644
index 000000000..004741c77
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(utils)/encoding-decoding.mdx
@@ -0,0 +1,517 @@
+---
+title: Codificación y decodificación
+description: Convertir entre valores de Clarity y tipos de JavaScript
+---
+## Visión general
+
+Stacks utiliza valores de Clarity (CVs) para representar datos en contratos inteligentes. Al construir aplicaciones, necesitarás codificar valores de JavaScript en CVs para llamadas a contratos y decodificar CVs de vuelta a JavaScript para su visualización. Esta guía cubre todos los tipos de CV y patrones de conversión.
+
+## Conversiones básicas de tipos
+
+### Enteros
+
+Convertir entre números de JavaScript y enteros de Clarity:
+
+```typescript
+import {
+ intCV,
+ uintCV,
+ cvToValue,
+ cvToJSON
+} from '@stacks/transactions';
+
+// Encoding
+const positiveInt = uintCV(42); // u42
+const negativeInt = intCV(-100); // -100
+const largeUint = uintCV(1000000); // u1000000
+
+// Decoding
+const jsValue = cvToValue(positiveInt); // 42
+const jsonValue = cvToJSON(positiveInt); // { type: 'uint', value: '42' }
+
+// Working with BigInt for large numbers
+const bigNumber = uintCV(BigInt('123456789012345678901234567890'));
+const decoded = cvToValue(bigNumber); // '123456789012345678901234567890'
+```
+
+### Booleanos
+
+Valores simples de verdadero/falso:
+
+```typescript
+import { trueCV, falseCV, boolCV } from '@stacks/transactions';
+
+// Encoding
+const clarityTrue = trueCV(); // true
+const clarityFalse = falseCV(); // false
+const fromBoolean = boolCV(true); // true
+
+// Decoding
+const jsBoolean = cvToValue(clarityTrue); // true
+```
+
+### Cadenas
+
+Manejar cadenas ASCII y UTF-8:
+
+```typescript
+import {
+ stringAsciiCV,
+ stringUtf8CV,
+ cvToString
+} from '@stacks/transactions';
+
+// ASCII strings (limited character set)
+const asciiString = stringAsciiCV('Hello World');
+const asciiDecoded = cvToValue(asciiString); // 'Hello World'
+
+// UTF-8 strings (full Unicode support)
+const utf8String = stringUtf8CV('Hello 世界! 🌍');
+const utf8Decoded = cvToValue(utf8String); // 'Hello 世界! 🌍'
+
+// Direct string extraction
+const directString = cvToString(utf8String); // 'Hello 世界! 🌍'
+```
+
+### Directores
+
+Codifica direcciones de Stacks y principales de contratos:
+
+```typescript
+import {
+ standardPrincipalCV,
+ contractPrincipalCV,
+ cvToValue
+} from '@stacks/transactions';
+
+// Standard principal (user address)
+const userPrincipal = standardPrincipalCV('SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY');
+
+// Contract principal
+const contractPrincipal = contractPrincipalCV(
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY',
+ 'my-contract'
+);
+
+// Decoding
+const address = cvToValue(userPrincipal);
+// 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY'
+
+const contract = cvToValue(contractPrincipal);
+// 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY.my-contract'
+```
+
+## Manejo de tipos complejos
+
+### Búferes
+
+Trabajar con datos binarios:
+
+```typescript
+import {
+ bufferCV,
+ bufferCVFromString,
+ cvToValue
+} from '@stacks/transactions';
+
+// From hex string
+const hexBuffer = bufferCV(Buffer.from('deadbeef', 'hex'));
+
+// From UTF-8 string
+const stringBuffer = bufferCVFromString('Hello Buffer');
+
+// From byte array
+const byteBuffer = bufferCV(new Uint8Array([1, 2, 3, 4]));
+
+// Decoding returns hex string
+const decoded = cvToValue(hexBuffer); // '0xdeadbeef'
+
+// Get raw buffer
+const rawBuffer = hexBuffer.buffer; // Buffer instance
+```
+
+### Valores opcionales
+
+Manejar el tipo opcional de Clarity:
+
+```typescript
+import {
+ someCV,
+ noneCV,
+ cvToValue
+} from '@stacks/transactions';
+
+// Some value (contains a value)
+const someValue = someCV(uintCV(42)); // (some u42)
+const someString = someCV(stringUtf8CV('hi')); // (some u"hi")
+
+// None value (no value)
+const noneValue = noneCV(); // none
+
+// Decoding
+const decodedSome = cvToValue(someValue); // 42
+const decodedNone = cvToValue(noneValue); // null
+
+// Check optional type
+if (someValue.type === ClarityType.OptionalSome) {
+ const innerValue = cvToValue(someValue.value);
+}
+```
+
+### Valores de respuesta
+
+Manejar tipos de respuesta de contrato:
+
+```typescript
+import {
+ responseOkCV,
+ responseErrorCV,
+ cvToValue
+} from '@stacks/transactions';
+
+// Success response
+const okResponse = responseOkCV(uintCV(100)); // (ok u100)
+const okString = responseOkCV(stringUtf8CV('Success')); // (ok u"Success")
+
+// Error response
+const errorResponse = responseErrorCV(uintCV(404)); // (err u404)
+const errorMsg = responseErrorCV(stringUtf8CV('Not found')); // (err u"Not found")
+
+// Decoding and checking
+const result = okResponse;
+if (result.type === ClarityType.ResponseOk) {
+ console.log('Success:', cvToValue(result.value));
+} else {
+ console.log('Error:', cvToValue(result.value));
+}
+```
+
+### Tuplas
+
+Crear y decodificar datos estructurados:
+
+```typescript
+import {
+ tupleCV,
+ cvToValue,
+ cvToJSON
+} from '@stacks/transactions';
+
+// Create tuple
+const userInfo = tupleCV({
+ id: uintCV(1),
+ name: stringUtf8CV('Alice'),
+ balance: uintCV(1000000),
+ active: trueCV(),
+ metadata: tupleCV({
+ created: uintCV(Date.now()),
+ tags: listCV([stringAsciiCV('user'), stringAsciiCV('premium')])
+ })
+});
+
+// Decode to JavaScript object
+const decoded = cvToValue(userInfo);
+// {
+// id: 1,
+// name: 'Alice',
+// balance: 1000000,
+// active: true,
+// metadata: {
+// created: 1234567890,
+// tags: ['user', 'premium']
+// }
+// }
+
+// Access tuple fields
+const nameCV = userInfo.data.name;
+const name = cvToValue(nameCV); // 'Alice'
+```
+
+### Listas
+
+Trabajar con matrices de valores:
+
+```typescript
+import {
+ listCV,
+ cvToValue
+} from '@stacks/transactions';
+
+// List of same type
+const numbers = listCV([uintCV(1), uintCV(2), uintCV(3)]);
+const strings = listCV([
+ stringUtf8CV('apple'),
+ stringUtf8CV('banana'),
+ stringUtf8CV('cherry')
+]);
+
+// List of tuples (common pattern)
+const users = listCV([
+ tupleCV({ id: uintCV(1), name: stringUtf8CV('Alice') }),
+ tupleCV({ id: uintCV(2), name: stringUtf8CV('Bob') }),
+]);
+
+// Decoding
+const decodedNumbers = cvToValue(numbers); // [1, 2, 3]
+const decodedUsers = cvToValue(users);
+// [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
+
+// Iterate over list
+numbers.list.forEach((cv, index) => {
+ console.log(`Item ${index}:`, cvToValue(cv));
+});
+```
+
+## Patrones de codificación avanzados
+
+### Codificación de tipo dinámica
+
+Construye codificadores para valores en tiempo de ejecución:
+
+```typescript
+function encodeValue(value: any): ClarityValue {
+ if (typeof value === 'number') {
+ return value >= 0 ? uintCV(value) : intCV(value);
+ } else if (typeof value === 'string') {
+ // Check if valid ASCII
+ if (/^[\x00-\x7F]*$/.test(value)) {
+ return stringAsciiCV(value);
+ }
+ return stringUtf8CV(value);
+ } else if (typeof value === 'boolean') {
+ return boolCV(value);
+ } else if (value === null || value === undefined) {
+ return noneCV();
+ } else if (Array.isArray(value)) {
+ return listCV(value.map(encodeValue));
+ } else if (typeof value === 'object') {
+ const tupleData: { [key: string]: ClarityValue } = {};
+ for (const [key, val] of Object.entries(value)) {
+ tupleData[key] = encodeValue(val);
+ }
+ return tupleCV(tupleData);
+ }
+
+ throw new Error(`Cannot encode value: ${value}`);
+}
+
+// Usage
+const encoded = encodeValue({
+ name: 'Alice',
+ age: 30,
+ tags: ['user', 'admin'],
+ active: true
+});
+```
+
+### Decodificación segura de tipos
+
+Crea decodificadores con validación de tipo:
+
+```typescript
+interface UserData {
+ id: number;
+ name: string;
+ balance: number;
+ active: boolean;
+}
+
+function decodeUser(cv: ClarityValue): UserData {
+ if (cv.type !== ClarityType.Tuple) {
+ throw new Error('Expected tuple');
+ }
+
+ const data = cv.data;
+
+ // Validate and extract each field
+ if (!data.id || data.id.type !== ClarityType.UInt) {
+ throw new Error('Invalid id field');
+ }
+
+ if (!data.name || (
+ data.name.type !== ClarityType.StringASCII &&
+ data.name.type !== ClarityType.StringUTF8
+ )) {
+ throw new Error('Invalid name field');
+ }
+
+ return {
+ id: Number(cvToValue(data.id)),
+ name: cvToString(data.name),
+ balance: Number(cvToValue(data.balance)),
+ active: cvToValue(data.active) as boolean,
+ };
+}
+```
+
+### Utilidades de codificación por lotes
+
+Codifica múltiples valores de manera eficiente:
+
+```typescript
+class ClarityEncoder {
+ static encodeArray(
+ items: T[],
+ encoder: (item: T) => ClarityValue
+ ): ClarityValue {
+ return listCV(items.map(encoder));
+ }
+
+ static encodeTuple>(
+ obj: T,
+ schema: { [K in keyof T]: (value: T[K]) => ClarityValue }
+ ): TupleCV {
+ const tupleData: { [key: string]: ClarityValue } = {};
+
+ for (const [key, encoder] of Object.entries(schema)) {
+ tupleData[key] = encoder(obj[key as keyof T]);
+ }
+
+ return tupleCV(tupleData);
+ }
+
+ static encodeOptional(
+ value: T | null | undefined,
+ encoder: (value: T) => ClarityValue
+ ): OptionalCV {
+ if (value === null || value === undefined) {
+ return noneCV();
+ }
+ return someCV(encoder(value));
+ }
+}
+
+// Usage
+const users = [
+ { id: 1, name: 'Alice', balance: 1000 },
+ { id: 2, name: 'Bob', balance: 2000 },
+];
+
+const encoded = ClarityEncoder.encodeArray(users, user =>
+ ClarityEncoder.encodeTuple(user, {
+ id: (id) => uintCV(id),
+ name: (name) => stringUtf8CV(name),
+ balance: (balance) => uintCV(balance),
+ })
+);
+```
+
+## Serialización y deserialización
+
+Trabaja con valores serializados de Clarity:
+
+```typescript
+import {
+ serializeCV,
+ deserializeCV,
+ cvToHex,
+ hexToCV
+} from '@stacks/transactions';
+
+// Serialize to buffer
+const cv = tupleCV({ amount: uintCV(1000), memo: stringUtf8CV('Payment') });
+const serialized = serializeCV(cv); // Buffer
+
+// Convert to hex for storage/transport
+const hex = cvToHex(cv); // '0x0c00000002046d656d6f...'
+
+// Deserialize from hex
+const deserialized = hexToCV(hex);
+const value = cvToValue(deserialized); // { amount: 1000, memo: 'Payment' }
+
+// Work with raw buffers
+const buffer = Buffer.from(hex, 'hex');
+const fromBuffer = deserializeCV(buffer);
+```
+
+## Patrones de conversión comunes
+
+### Argumentos de llamada de contrato
+
+Preparar argumentos para llamadas de contrato:
+
+```typescript
+function prepareTransferArgs(
+ recipient: string,
+ amount: number,
+ memo?: string
+): ClarityValue[] {
+ const args = [
+ standardPrincipalCV(recipient),
+ uintCV(amount),
+ ];
+
+ if (memo) {
+ args.push(someCV(stringUtf8CV(memo)));
+ } else {
+ args.push(noneCV());
+ }
+
+ return args;
+}
+
+// Usage in contract call
+const functionArgs = prepareTransferArgs(
+ 'SP2J6Y09JMFWWZCT4VJX0BA5W7A9HZP5EX96Y6VZY',
+ 1000000,
+ 'Monthly payment'
+);
+```
+
+### Manejo de respuestas
+
+Procesar respuestas de contratos:
+
+```typescript
+function handleContractResponse(response: ClarityValue): {
+ success: boolean;
+ data: any;
+ error?: string;
+} {
+ if (response.type === ClarityType.ResponseOk) {
+ return {
+ success: true,
+ data: cvToValue(response.value),
+ };
+ } else if (response.type === ClarityType.ResponseErr) {
+ const errorValue = cvToValue(response.value);
+ return {
+ success: false,
+ data: null,
+ error: typeof errorValue === 'string' ? errorValue : `Error: ${errorValue}`,
+ };
+ }
+
+ throw new Error('Invalid response type');
+}
+```
+
+## Mejores prácticas
+
+* **Validar tipos**: Siempre verifica los tipos de CV antes de decodificar
+* **Manejar casos extremos**: Considerar valores nulos, indefinidos y vacíos
+* **Utiliza los tipos de cadena apropiados**: ASCII para texto simple, UTF-8 para internacional
+* **Preservar la precisión**: Usa BigInt para números grandes
+* **Estrechamiento de tipos**: Usa guardas de tipo de TypeScript para seguridad
+
+## Errores comunes
+
+**Confusión de tipos de cadena**
+
+```typescript
+// Bad: Using ASCII for Unicode
+const bad = stringAsciiCV('Hello 世界'); // Will throw error
+
+// Good: Use UTF-8 for Unicode
+const good = stringUtf8CV('Hello 世界');
+```
+
+**Desbordamiento de números**
+
+```typescript
+// Bad: JavaScript number too large
+const bad = uintCV(Number.MAX_SAFE_INTEGER + 1); // Precision loss
+
+// Good: Use BigInt
+const good = uintCV(BigInt('9007199254740992'));
+```
diff --git a/content/docs/es/reference/stacks.js/(utils)/network-configuration.mdx b/content/docs/es/reference/stacks.js/(utils)/network-configuration.mdx
new file mode 100644
index 000000000..942896a43
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(utils)/network-configuration.mdx
@@ -0,0 +1,536 @@
+---
+title: Configuración de red
+description: Configurar y personalizar las conexiones de red de Stacks
+---
+## Visión general
+
+Stacks.js admite múltiples redes: mainnet para producción, testnet para desarrollo y redes personalizadas para pruebas locales. La configuración adecuada de la red garantiza que su aplicación se conecte a la instancia correcta de blockchain con la configuración óptima.
+
+## Configuración básica de red
+
+Configurar redes estándar:
+
+```typescript
+import {
+ StacksMainnet,
+ StacksTestnet,
+ StacksMocknet
+} from '@stacks/network';
+
+// Production network
+const mainnet = new StacksMainnet();
+console.log('Mainnet API:', mainnet.coreApiUrl);
+// https://api.hiro.so
+
+// Test network
+const testnet = new StacksTestnet();
+console.log('Testnet API:', testnet.coreApiUrl);
+// https://api.testnet.hiro.so
+
+// Local development network
+const mocknet = new StacksMocknet();
+console.log('Mocknet API:', mocknet.coreApiUrl);
+// http://localhost:3999
+```
+
+## Configuración de red personalizada
+
+Crear redes con puntos finales personalizados:
+
+```typescript
+import { StacksNetwork } from '@stacks/network';
+
+// Custom mainnet configuration
+const customMainnet = new StacksMainnet({
+ url: 'https://my-custom-node.com',
+ fetchFn: fetch, // Custom fetch implementation
+});
+
+// Custom testnet with specific endpoints
+const customTestnet = new StacksTestnet({
+ url: 'https://my-testnet-node.com:3999',
+});
+
+// Fully custom network
+class CustomNetwork extends StacksNetwork {
+ constructor() {
+ super({
+ url: 'https://custom-stacks-node.com',
+ networkType: 'mainnet', // or 'testnet', 'mocknet'
+ });
+ }
+
+ // Override methods as needed
+ getBroadcastApiUrl() {
+ return `${this.coreApiUrl}/custom/broadcast`;
+ }
+}
+```
+
+## Configuración basada en el entorno
+
+Gestionar redes en diferentes entornos:
+
+```typescript
+// config/network.ts
+import {
+ StacksNetwork,
+ StacksMainnet,
+ StacksTestnet,
+ StacksMocknet
+} from '@stacks/network';
+
+interface NetworkConfig {
+ network: StacksNetwork;
+ apiUrl: string;
+ wsUrl?: string;
+ explorerUrl: string;
+ faucetUrl?: string;
+}
+
+const configs: Record = {
+ production: {
+ network: new StacksMainnet(),
+ apiUrl: 'https://api.hiro.so',
+ wsUrl: 'wss://api.hiro.so',
+ explorerUrl: 'https://explorer.hiro.so',
+ },
+ staging: {
+ network: new StacksTestnet(),
+ apiUrl: 'https://api.testnet.hiro.so',
+ wsUrl: 'wss://api.testnet.hiro.so',
+ explorerUrl: 'https://explorer.hiro.so/?chain=testnet',
+ faucetUrl: 'https://api.testnet.hiro.so/extended/v1/faucets/stx',
+ },
+ development: {
+ network: new StacksMocknet(),
+ apiUrl: 'http://localhost:3999',
+ explorerUrl: 'http://localhost:8000',
+ },
+};
+
+export function getNetworkConfig(): NetworkConfig {
+ const env = process.env.NODE_ENV || 'development';
+ return configs[env];
+}
+
+// Usage
+const { network, apiUrl } = getNetworkConfig();
+```
+
+## Detección y validación de red
+
+Detectar y validar conexiones de red:
+
+```typescript
+async function detectNetwork(url: string): Promise<'mainnet' | 'testnet' | 'unknown'> {
+ try {
+ const response = await fetch(`${url}/v2/info`);
+ const info = await response.json();
+
+ // Check network ID
+ if (info.network_id === 1) {
+ return 'mainnet';
+ } else if (info.network_id === 2147483648) {
+ return 'testnet';
+ }
+
+ return 'unknown';
+ } catch (error) {
+ console.error('Failed to detect network:', error);
+ return 'unknown';
+ }
+}
+
+// Validate network matches expectation
+async function validateNetwork(
+ network: StacksNetwork,
+ expected: 'mainnet' | 'testnet'
+): Promise {
+ const detected = await detectNetwork(network.coreApiUrl);
+
+ if (detected !== expected) {
+ console.warn(`Network mismatch! Expected ${expected}, got ${detected}`);
+ return false;
+ }
+
+ return true;
+}
+```
+
+## Características de red avanzadas
+
+### Encabezados personalizados y autenticación
+
+Agregar autenticación o encabezados personalizados:
+
+```typescript
+class AuthenticatedNetwork extends StacksMainnet {
+ private apiKey: string;
+
+ constructor(apiKey: string) {
+ super();
+ this.apiKey = apiKey;
+ }
+
+ createFetchFn(): FetchFn {
+ return (url: string, init?: RequestInit) => {
+ const headers = {
+ ...init?.headers,
+ 'x-api-key': this.apiKey,
+ 'x-client-version': '1.0.0',
+ };
+
+ return fetch(url, { ...init, headers });
+ };
+ }
+}
+
+// Usage
+const network = new AuthenticatedNetwork(process.env.API_KEY!);
+```
+
+### Solicitud de reintento y tiempo de espera
+
+Implementar solicitudes de red resilientes:
+
+```typescript
+class ResilientNetwork extends StacksTestnet {
+ private maxRetries = 3;
+ private timeout = 30000; // 30 seconds
+
+ createFetchFn(): FetchFn {
+ return async (url: string, init?: RequestInit) => {
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
+ try {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
+
+ const response = await fetch(url, {
+ ...init,
+ signal: controller.signal,
+ });
+
+ clearTimeout(timeoutId);
+
+ if (!response.ok && attempt < this.maxRetries - 1) {
+ // Retry on server errors
+ if (response.status >= 500) {
+ await this.delay(1000 * Math.pow(2, attempt));
+ continue;
+ }
+ }
+
+ return response;
+ } catch (error) {
+ if (attempt === this.maxRetries - 1) throw error;
+ await this.delay(1000 * Math.pow(2, attempt));
+ }
+ }
+
+ throw new Error('Max retries exceeded');
+ };
+ }
+
+ private delay(ms: number): Promise {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ }
+}
+```
+
+## Configuraciones específicas de red
+
+### Configurar por ID de cadena
+
+Configurar la red basada en el identificador de cadena:
+
+```typescript
+function getNetworkByChainId(chainId: number): StacksNetwork {
+ switch (chainId) {
+ case 1: // Mainnet
+ return new StacksMainnet();
+ case 2147483648: // Testnet
+ return new StacksTestnet();
+ default:
+ throw new Error(`Unknown chain ID: ${chainId}`);
+ }
+}
+
+// Dynamic network from wallet
+async function getNetworkFromWallet(): Promise {
+ const userData = userSession.loadUserData();
+ const address = userData.profile.stxAddress.testnet;
+
+ // Determine network from address prefix
+ if (address.startsWith('SP') || address.startsWith('SM')) {
+ return new StacksMainnet();
+ } else if (address.startsWith('ST') || address.startsWith('SN')) {
+ return new StacksTestnet();
+ }
+
+ throw new Error('Unable to determine network from address');
+}
+```
+
+### Soporte para múltiples redes
+
+Admite múltiples redes simultáneamente:
+
+```typescript
+class NetworkManager {
+ private networks: Map = new Map();
+ private currentNetwork: string = 'testnet';
+
+ constructor() {
+ this.networks.set('mainnet', new StacksMainnet());
+ this.networks.set('testnet', new StacksTestnet());
+ this.networks.set('devnet', new StacksMocknet());
+ }
+
+ getNetwork(name?: string): StacksNetwork {
+ const networkName = name || this.currentNetwork;
+ const network = this.networks.get(networkName);
+
+ if (!network) {
+ throw new Error(`Unknown network: ${networkName}`);
+ }
+
+ return network;
+ }
+
+ setCurrentNetwork(name: string): void {
+ if (!this.networks.has(name)) {
+ throw new Error(`Unknown network: ${name}`);
+ }
+ this.currentNetwork = name;
+ }
+
+ addCustomNetwork(name: string, url: string): void {
+ const network = new StacksNetwork({ url });
+ this.networks.set(name, network);
+ }
+}
+
+// Usage
+const manager = new NetworkManager();
+const mainnet = manager.getNetwork('mainnet');
+manager.setCurrentNetwork('mainnet');
+```
+
+## Monitoreo de conexión de red
+
+Monitorear la salud y el estado de la red:
+
+```typescript
+class NetworkMonitor {
+ private network: StacksNetwork;
+ private isHealthy = true;
+ private listeners: Set<(healthy: boolean) => void> = new Set();
+
+ constructor(network: StacksNetwork) {
+ this.network = network;
+ this.startMonitoring();
+ }
+
+ private async startMonitoring() {
+ setInterval(async () => {
+ try {
+ const response = await fetch(
+ `${this.network.coreApiUrl}/v2/info`,
+ { signal: AbortSignal.timeout(5000) }
+ );
+
+ const wasHealthy = this.isHealthy;
+ this.isHealthy = response.ok;
+
+ if (wasHealthy !== this.isHealthy) {
+ this.notifyListeners();
+ }
+ } catch (error) {
+ const wasHealthy = this.isHealthy;
+ this.isHealthy = false;
+
+ if (wasHealthy) {
+ this.notifyListeners();
+ }
+ }
+ }, 30000); // Check every 30 seconds
+ }
+
+ onHealthChange(callback: (healthy: boolean) => void): () => void {
+ this.listeners.add(callback);
+ return () => this.listeners.delete(callback);
+ }
+
+ private notifyListeners() {
+ this.listeners.forEach(callback => callback(this.isHealthy));
+ }
+
+ async waitForHealth(timeout = 60000): Promise {
+ const start = Date.now();
+
+ while (!this.isHealthy && Date.now() - start < timeout) {
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ }
+
+ if (!this.isHealthy) {
+ throw new Error('Network unhealthy after timeout');
+ }
+ }
+}
+```
+
+## Configuración de WebSocket
+
+Configurar conexiones en tiempo real:
+
+```typescript
+interface WebSocketConfig {
+ url: string;
+ reconnectInterval: number;
+ maxReconnectAttempts: number;
+}
+
+class StacksWebSocketClient {
+ private ws: WebSocket | null = null;
+ private config: WebSocketConfig;
+ private reconnectAttempts = 0;
+
+ constructor(network: StacksNetwork) {
+ this.config = {
+ url: this.getWebSocketUrl(network),
+ reconnectInterval: 5000,
+ maxReconnectAttempts: 10,
+ };
+ }
+
+ private getWebSocketUrl(network: StacksNetwork): string {
+ const apiUrl = network.coreApiUrl;
+ return apiUrl.replace('https://', 'wss://').replace('http://', 'ws://');
+ }
+
+ connect(): void {
+ this.ws = new WebSocket(this.config.url);
+
+ this.ws.onopen = () => {
+ console.log('WebSocket connected');
+ this.reconnectAttempts = 0;
+ };
+
+ this.ws.onclose = () => {
+ this.handleReconnect();
+ };
+
+ this.ws.onerror = (error) => {
+ console.error('WebSocket error:', error);
+ };
+ }
+
+ private handleReconnect(): void {
+ if (this.reconnectAttempts < this.config.maxReconnectAttempts) {
+ setTimeout(() => {
+ this.reconnectAttempts++;
+ this.connect();
+ }, this.config.reconnectInterval);
+ }
+ }
+
+ subscribe(event: string, callback: (data: any) => void): void {
+ if (!this.ws) throw new Error('WebSocket not connected');
+
+ this.ws.send(JSON.stringify({
+ method: 'subscribe',
+ params: { event }
+ }));
+
+ this.ws.onmessage = (message) => {
+ const data = JSON.parse(message.data);
+ if (data.event === event) {
+ callback(data);
+ }
+ };
+ }
+}
+```
+
+## Probando con diferentes redes
+
+Configurar pruebas en diferentes redes:
+
+```typescript
+import { describe, it, beforeEach } from 'vitest';
+
+describe('Cross-network tests', () => {
+ const networks = [
+ { name: 'mainnet', network: new StacksMainnet() },
+ { name: 'testnet', network: new StacksTestnet() },
+ ];
+
+ networks.forEach(({ name, network }) => {
+ describe(`${name} tests`, () => {
+ it('should connect to network', async () => {
+ const response = await fetch(`${network.coreApiUrl}/v2/info`);
+ expect(response.ok).toBe(true);
+ });
+
+ it('should have correct chain ID', async () => {
+ const response = await fetch(`${network.coreApiUrl}/v2/info`);
+ const info = await response.json();
+
+ if (name === 'mainnet') {
+ expect(info.network_id).toBe(1);
+ } else {
+ expect(info.network_id).toBe(2147483648);
+ }
+ });
+ });
+ });
+});
+```
+
+## Mejores prácticas
+
+* **Utilizar variables de entorno**: Nunca codifiques URLs de red de forma estática
+* **Implementar lógica de reintento**: Las redes pueden estar temporalmente no disponibles
+* **Monitorear la salud de la conexión**: Detectar y manejar problemas de red
+* **Información de red en caché**: Reducir llamadas redundantes a la API
+* **Validar tipo de red**: Asegúrate de estar en la red esperada
+
+## Problemas comunes
+
+**Errores de CORS**
+
+```typescript
+// Configure proxy for development
+const devNetwork = new StacksTestnet({
+ url: '/api', // Proxy through your dev server
+});
+
+// Or use CORS-enabled endpoints
+const corsNetwork = new StacksTestnet({
+ url: 'https://api.testnet.hiro.so',
+});
+```
+
+**Manejo de tiempo de espera**
+
+```typescript
+// Add timeout to all requests
+class TimeoutNetwork extends StacksMainnet {
+ async fetchWithTimeout(url: string, timeout = 30000): Promise {
+ const controller = new AbortController();
+ const id = setTimeout(() => controller.abort(), timeout);
+
+ try {
+ const response = await fetch(url, {
+ signal: controller.signal,
+ });
+ clearTimeout(id);
+ return response;
+ } catch (error) {
+ clearTimeout(id);
+ throw new Error(`Request timeout: ${url}`);
+ }
+ }
+}
+```
diff --git a/content/docs/es/reference/stacks.js/(utils)/unit-conversion.mdx b/content/docs/es/reference/stacks.js/(utils)/unit-conversion.mdx
new file mode 100644
index 000000000..6c3ea9ce3
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/(utils)/unit-conversion.mdx
@@ -0,0 +1,218 @@
+---
+title: Conversión de unidades
+description: Convertir entre STX, microSTX y otras unidades
+---
+Aprende cómo convertir entre diferentes denominaciones de unidades en Stacks. La blockchain utiliza microSTX como su unidad base, donde 1 STX = 1,000,000 microSTX. La conversión adecuada de unidades es esencial para mostrar cantidades a los usuarios y procesar transacciones.
+
+## Conversiones básicas
+
+Convierta entre STX y microSTX utilizando funciones de conversión simples.
+
+```typescript
+// Convert STX to microSTX
+function stxToMicroStx(stx: number | string): bigint {
+ const stxAmount = typeof stx === 'string' ? parseFloat(stx) : stx;
+ return BigInt(Math.floor(stxAmount * 1_000_000));
+}
+
+// Convert microSTX to STX
+function microStxToStx(microStx: number | bigint | string): string {
+ const amount = BigInt(microStx);
+ const stx = Number(amount) / 1_000_000;
+ return stx.toFixed(6).replace(/\.?0+$/, '');
+}
+
+// Usage examples
+const microStx = stxToMicroStx(1.5); // 1500000n
+const stx = microStxToStx(1500000); // "1.5"
+```
+
+## Manejo seguro de precisión
+
+Maneja números grandes sin pérdida de precisión utilizando operaciones BigInt.
+
+```typescript
+class StxConverter {
+ static readonly MICROSTX_PER_STX = 1_000_000n;
+
+ static toMicroStx(amount: string | number, decimals = 6): bigint {
+ const amountStr = amount.toString();
+ const [whole, decimal = ''] = amountStr.split('.');
+ const paddedDecimal = decimal.padEnd(decimals, '0').slice(0, decimals);
+ return BigInt(whole + paddedDecimal);
+ }
+
+ static toStx(microStx: bigint | string | number): string {
+ const amount = BigInt(microStx);
+ const isNegative = amount < 0n;
+ const absoluteAmount = isNegative ? -amount : amount;
+
+ const str = absoluteAmount.toString().padStart(7, '0');
+ const whole = str.slice(0, -6) || '0';
+ const decimal = str.slice(-6);
+
+ let result = `${whole}.${decimal}`.replace(/\.?0+$/, '');
+ return isNegative ? `-${result}` : result;
+ }
+}
+
+// Precise conversion examples
+const precise1 = StxConverter.toMicroStx('123.456789'); // 123456789n
+const precise2 = StxConverter.toStx(123456789n); // "123.456789"
+```
+
+## Conversiones de tokens
+
+Maneja tokens con diferentes decimales usando una clase de conversión flexible.
+
+```typescript
+interface TokenInfo {
+ decimals: number;
+ symbol: string;
+ name: string;
+}
+
+class TokenConverter {
+ constructor(private tokenInfo: TokenInfo) {}
+
+ toSmallestUnit(amount: string | number): bigint {
+ if (typeof amount === 'string') {
+ const [whole, decimal = ''] = amount.split('.');
+ const paddedDecimal = decimal
+ .padEnd(this.tokenInfo.decimals, '0')
+ .slice(0, this.tokenInfo.decimals);
+ return BigInt(whole + paddedDecimal);
+ }
+
+ const multiplier = 10n ** BigInt(this.tokenInfo.decimals);
+ return BigInt(Math.floor(amount * Number(multiplier)));
+ }
+
+ fromSmallestUnit(amount: bigint | string): string {
+ const value = BigInt(amount);
+ const divisor = 10n ** BigInt(this.tokenInfo.decimals);
+ const whole = value / divisor;
+ const remainder = value % divisor;
+
+ if (remainder === 0n) return whole.toString();
+
+ const decimal = remainder
+ .toString()
+ .padStart(this.tokenInfo.decimals, '0')
+ .replace(/0+$/, '');
+
+ return `${whole}.${decimal}`;
+ }
+}
+
+// Different token examples
+const usdc = new TokenConverter({ decimals: 6, symbol: 'USDC', name: 'USD Coin' });
+const btc = new TokenConverter({ decimals: 8, symbol: 'BTC', name: 'Bitcoin' });
+
+const usdcAmount = usdc.toSmallestUnit('100.50'); // 100500000n
+const btcAmount = btc.toSmallestUnit('0.00123456'); // 123456n
+```
+
+## Mostrar formato
+
+Formatear cantidades para interfaces de usuario con soporte de localización.
+
+```typescript
+class StxFormatter {
+ static format(microStx: bigint, options?: {
+ decimals?: number;
+ locale?: string;
+ symbol?: boolean;
+ }): string {
+ const stx = StxConverter.toStx(microStx);
+ const number = parseFloat(stx);
+
+ const formatted = new Intl.NumberFormat(options?.locale || 'en-US', {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: options?.decimals ?? 6,
+ }).format(number);
+
+ return options?.symbol ? `${formatted} STX` : formatted;
+ }
+
+ static compact(microStx: bigint): string {
+ const stx = Number(StxConverter.toStx(microStx));
+
+ if (stx >= 1_000_000) {
+ return `${(stx / 1_000_000).toFixed(2)}M STX`;
+ } else if (stx >= 1_000) {
+ return `${(stx / 1_000).toFixed(2)}K STX`;
+ }
+
+ return this.format(microStx, { decimals: 6, symbol: true });
+ }
+}
+
+// Formatting examples
+const formatted = StxFormatter.format(123456789n, {
+ decimals: 2,
+ symbol: true
+}); // "123.46 STX"
+
+const compact = StxFormatter.compact(1234567890000n); // "1.23K STX"
+```
+
+## Validación de entrada
+
+Validar y desinfectar la entrada del usuario para los campos de cantidad.
+
+```typescript
+class AmountInput {
+ static validate(input: string, options?: {
+ decimals?: number;
+ min?: string;
+ max?: string;
+ }): { valid: boolean; error?: string } {
+ // Check format
+ if (!/^\d*\.?\d*$/.test(input)) {
+ return { valid: false, error: 'Invalid number format' };
+ }
+
+ // Check decimal places
+ const parts = input.split('.');
+ if (parts[1] && parts[1].length > (options?.decimals || 6)) {
+ return { valid: false, error: `Maximum ${options?.decimals || 6} decimal places` };
+ }
+
+ // Check range
+ if (options?.min) {
+ const value = parseFloat(input);
+ if (value < parseFloat(options.min)) {
+ return { valid: false, error: `Minimum amount is ${options.min}` };
+ }
+ }
+
+ return { valid: true };
+ }
+
+ static sanitize(input: string, decimals = 6): string {
+ let sanitized = input.replace(/[^\d.]/g, '');
+ const parts = sanitized.split('.');
+
+ if (parts.length > 2) {
+ sanitized = parts[0] + '.' + parts.slice(1).join('');
+ }
+
+ if (parts[1] && parts[1].length > decimals) {
+ sanitized = parts[0] + '.' + parts[1].slice(0, decimals);
+ }
+
+ return sanitized;
+ }
+}
+
+// Validation examples
+const result1 = AmountInput.validate('123.456', {
+ decimals: 6,
+ min: '0.000001'
+}); // { valid: true }
+
+const result2 = AmountInput.validate('123.4567890', {
+ decimals: 6
+}); // { valid: false, error: 'Maximum 6 decimal places' }
+```
diff --git a/content/docs/es/reference/stacks.js/index.mdx b/content/docs/es/reference/stacks.js/index.mdx
new file mode 100644
index 000000000..f42a48415
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/index.mdx
@@ -0,0 +1,75 @@
+---
+title: Stacks.js
+sidebarTitle: Visión general
+description: Un SDK de JavaScript/TypeScript para construir aplicaciones en la cadena de bloques Stacks.
+llm: false
+---
+## Visión general
+
+Stacks.js es una colección de bibliotecas de JavaScript que te permiten construir aplicaciones web en la cadena de bloques Stacks. Desde autenticación de billeteras hasta interacciones con contratos inteligentes.
+
+Para explorar Stacks.js con IA, copie y pegue [llms.txt](/reference/stacks.js/llms.txt) en tu LLM de elección.
+
+## Características principales
+
+* **Construcción de transacciones** - Construir y transmitir todos los tipos de transacciones con APIs de tipo seguro
+* **Interacción con contratos inteligentes** - Desplegar contratos y llamar funciones con codificación automática
+* **Integración de billetera** - Conéctese a Leather, Xverse y otras billeteras de Stacks sin problemas
+* **Postcondiciones** - Proteger a los usuarios con validaciones de transferencia de activos incorporadas
+
+## Instalación
+
+Stacks.js está separado en paquetes específicos publicados bajo el `@stacks` alcance. Instala solo lo que necesitas:
+
+
+ ```terminal !! transactions
+ $ npm install @stacks/transactions
+ ```
+
+ ```terminal !! connect
+ $ npm install @stacks/connect
+ ```
+
+ ```terminal !! network
+ $ npm install @stacks/network
+ ```
+
+ ```terminal !! common
+ $ npm install @stacks/common
+ ```
+
+
+
+
+ Paquetes disponibles
+
+
+ * `@stacks/api`
+ * `@stacks/auth`
+ * `@stacks/encryption`
+ * `@stacks/network`
+ * `@stacks/stacking`
+ * `@stacks/transactions`
+ * `@stacks/bns`
+ * `@stacks/common`
+ * `@stacks/profile`
+ * `@stacks/storage`
+ * `@stacks/wallet-sdk`
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Conectar billetera](/reference/stacks.js/connect-wallet): Agregar autenticación de billetera
+* [Construir transacciones](/reference/stacks.js/build-transactions): Construir y transmitir transacciones
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con Stacks.js?
+
+Contáctenos en el **#stacks-js** canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horario de oficina semanal](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/reference/stacks.js/meta.json b/content/docs/es/reference/stacks.js/meta.json
new file mode 100644
index 000000000..61a619baa
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/meta.json
@@ -0,0 +1,19 @@
+{
+ "title": "Stacks.js",
+ "root": true,
+ "pages": [
+ "---Stacks.js---",
+ "index",
+ "...(overview)",
+ "---Local accounts---",
+ "...(local-accounts)",
+ "---Stacks Connect---",
+ "...(connect)",
+ "---Post-conditions---",
+ "...(post-conditions)",
+ "---Integrations---",
+ "...(integrations)",
+ "---Reference---",
+ "...packages"
+ ]
+}
diff --git a/content/docs/es/reference/stacks.js/packages/connect.mdx b/content/docs/es/reference/stacks.js/packages/connect.mdx
new file mode 100644
index 000000000..239abac84
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/packages/connect.mdx
@@ -0,0 +1,354 @@
+---
+title: '@stacks/connect'
+description: Autenticar usuarios e interactuar con billeteras Stacks en aplicaciones web.
+---
+El `@stacks/connect` El paquete proporciona una interfaz simple para conectar aplicaciones web a billeteras Stacks, habilitando capacidades de autenticación de usuario, firma de transacciones y firma de mensajes.
+
+## Instalación
+
+```package-install
+@stacks/connect
+```
+
+## Funciones de conexión
+
+### conectar \[#connect]
+
+`connect` inicia una conexión de billetera y almacena las direcciones de usuario en el almacenamiento local.
+
+### Firma
+
+```typescript
+function connect(options?: ConnectOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `options` | `ConnectOptions` | No | Opciones de configuración para la conexión |
+
+### Ejemplos
+
+#### Conexión básica
+
+```typescript
+import { connect } from '@stacks/connect';
+
+const response = await connect();
+// Response contains user addresses stored in local storage
+```
+
+#### Conexión con opciones
+
+```typescript
+const response = await connect({
+ forceWalletSelect: true,
+ approvedProviderIds: ['LeatherProvider', 'xverse']
+});
+```
+
+### isConnected \[#isConnected]
+
+`isConnected` comprueba si una billetera está actualmente conectada.
+
+```typescript
+import { isConnected } from '@stacks/connect';
+
+if (isConnected()) {
+ console.log('Wallet is connected');
+}
+```
+
+### desconectar \[#disconnect]
+
+`disconnect` borra el estado de la conexión y el almacenamiento local.
+
+```typescript
+import { disconnect } from '@stacks/connect';
+
+disconnect(); // Clears wallet connection
+```
+
+### getLocalStorage \[#getLocalStorage]
+
+`getLocalStorage` recupera los datos de conexión almacenados.
+
+```typescript
+import { getLocalStorage } from '@stacks/connect';
+
+const data = getLocalStorage();
+// {
+// "addresses": {
+// "stx": [{ "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN" }],
+// "btc": [{ "address": "bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae" }]
+// }
+// }
+```
+
+## Método de solicitud
+
+### solicitud \[#request]
+
+`request` es el método principal para interactuar con las billeteras conectadas.
+
+### Firma
+
+```typescript
+function request(
+ options: RequestOptions | undefined,
+ method: T,
+ params?: MethodParams[T]
+): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `options` | `RequestOptions` | No | Opciones de configuración de solicitud |
+| `method` | `StacksMethod` | Sí | Método para llamar en la billetera |
+| `params` | `MethodParams[T]` | Depende del método | Parámetros para el método |
+
+### Opciones de solicitud
+
+| Nombre | Tipo | Predeterminado | Descripción |
+|--------|------|----------------|-------------|
+| `provider` | `StacksProvider` | Detección automática | Instancia de proveedor personalizada |
+| `forceWalletSelect` | `boolean` | `false` | Forzar modal de selección de billetera |
+| `persistWalletSelect` | `boolean` | `true` | Mantener selección de billetera |
+| `enableOverrides` | `boolean` | `true` | Habilitar correcciones de compatibilidad |
+| `enableLocalStorage` | `boolean` | `true` | Almacenar direcciones localmente |
+| `approvedProviderIds` | `string[]` | Todos los proveedores | Filtrar billeteras disponibles |
+
+### Ejemplos
+
+#### Solicitud básica
+
+```typescript
+import { request } from '@stacks/connect';
+
+const addresses = await request('getAddresses');
+```
+
+#### Solicitud con opciones
+
+```typescript
+const response = await request(
+ { forceWalletSelect: true },
+ 'stx_transferStx',
+ {
+ amount: '1000000', // 1 STX in microSTX
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159'
+ }
+);
+```
+
+## Métodos de billetera
+
+### getAddresses \[#getAddresses]
+
+`getAddresses` recupera direcciones de Bitcoin y Stacks de la cartera.
+
+```typescript
+const response = await request('getAddresses');
+// {
+// "addresses": [
+// {
+// "address": "bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae",
+// "publicKey": "062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69"
+// },
+// {
+// "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN",
+// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304"
+// }
+// ]
+// }
+```
+
+### sendTransfer \[#sendTransfer]
+
+`sendTransfer` envía Bitcoin a uno o más destinatarios.
+
+```typescript
+const response = await request('sendTransfer', {
+ recipients: [
+ {
+ address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4',
+ amount: '1000' // Amount in satoshis
+ },
+ {
+ address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',
+ amount: '2000'
+ }
+ ]
+});
+// { "txid": "0x1234..." }
+```
+
+### signPsbt \[#signPsbt]
+
+`signPsbt` firma una transacción de Bitcoin parcialmente firmada.
+
+```typescript
+const response = await request('signPsbt', {
+ psbt: 'cHNidP...', // Base64 encoded PSBT
+ signInputs: [{ index: 0, address }], // Optional: specify inputs to sign
+ broadcast: false // Optional: broadcast after signing
+});
+// {
+// "psbt": "cHNidP...", // Signed PSBT
+// "txid": "0x1234..." // If broadcast is true
+// }
+```
+
+## Métodos específicos de Stacks
+
+### stx\_transferStx \[#stx\_transferStx]
+
+`stx_transferStx` transfiere tokens STX entre direcciones.
+
+```typescript
+const response = await request('stx_transferStx', {
+ amount: '1000000', // Amount in microSTX (1 STX = 1,000,000 microSTX)
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ memo: 'Payment for services', // Optional
+ network: 'mainnet' // Optional, defaults to mainnet
+});
+// { "txid": "0x1234..." }
+```
+
+### stx\_callContract \[#stx\_callContract]
+
+`stx_callContract` llama a una función pública en un contrato inteligente.
+
+```typescript
+import { Cl } from '@stacks/transactions';
+
+const response = await request('stx_callContract', {
+ contract: 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.hello-world',
+ functionName: 'say-hi',
+ functionArgs: [Cl.stringUtf8('Hello!')],
+ network: 'mainnet'
+});
+// { "txid": "0x1234..." }
+```
+
+### stx\_deployContract \[#stx\_deployContract]
+
+`stx_deployContract` despliega un nuevo contrato inteligente.
+
+```typescript
+const response = await request('stx_deployContract', {
+ name: 'my-contract',
+ clarityCode: `(define-public (say-hi (name (string-utf8 50)))
+ (ok (concat "Hello, " name "!"))
+ )`,
+ clarityVersion: '2', // Optional
+ network: 'testnet'
+});
+// { "txid": "0x1234..." }
+```
+
+### stx\_signMessage \[#stx\_signMessage]
+
+`stx_signMessage` firma un mensaje de texto plano.
+
+```typescript
+const response = await request('stx_signMessage', {
+ message: 'Hello, World!'
+});
+// {
+// "signature": "0x1234...",
+// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304"
+// }
+```
+
+### stx\_signStructuredMessage \[#stx\_signStructuredMessage]
+
+`stx_signStructuredMessage` firma un mensaje estructurado de Clarity siguiendo SIP-018.
+
+```typescript
+import { Cl } from '@stacks/transactions';
+
+const message = Cl.tuple({
+ action: Cl.stringAscii('transfer'),
+ amount: Cl.uint(1000000n)
+});
+
+const domain = Cl.tuple({
+ name: Cl.stringAscii('MyApp'),
+ version: Cl.stringAscii('1.0.0'),
+ 'chain-id': Cl.uint(1) // mainnet
+});
+
+const response = await request('stx_signStructuredMessage', {
+ message,
+ domain
+});
+// {
+// "signature": "0x1234...",
+// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304"
+// }
+```
+
+### stx\_getAccounts \[#stx\_getAccounts]
+
+`stx_getAccounts` recupera información detallada de la cuenta, incluyendo la configuración de Gaia.
+
+```typescript
+const response = await request('stx_getAccounts');
+// {
+// "addresses": [{
+// "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN",
+// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cd...",
+// "gaiaHubUrl": "https://hub.hiro.so",
+// "gaiaAppKey": "0488ade4040658015580000000dc81e3a5..."
+// }]
+// }
+```
+
+## Manejo de errores
+
+Maneja los errores de la billetera utilizando patrones estándar de manejo de errores de Promesas.
+
+```typescript
+try {
+ const response = await request('stx_transferStx', {
+ amount: '1000000',
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159'
+ });
+ console.log('Transaction successful:', response.txid);
+} catch (error) {
+ console.error('Transaction failed:', error);
+}
+```
+
+## Uso avanzado
+
+### requestRaw \[#requestRaw]
+
+`requestRaw` proporciona acceso directo a los proveedores de billeteras sin características de compatibilidad.
+
+### Firma
+
+```typescript
+function requestRaw(
+ provider: StacksProvider,
+ method: T,
+ params?: MethodParams[T]
+): Promise
+```
+
+### Ejemplo
+
+```typescript
+import { requestRaw } from '@stacks/connect';
+
+const provider = window.StacksProvider;
+const response = await requestRaw(provider, 'getAddresses');
+```
+
+## Notas de migración
+
+La versión 8.x.x implementa [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) estándares de billetera. Para la autenticación heredada basada en JWT, use la versión 7.10.1.
diff --git a/content/docs/es/reference/stacks.js/packages/network.mdx b/content/docs/es/reference/stacks.js/packages/network.mdx
new file mode 100644
index 000000000..8499ce277
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/packages/network.mdx
@@ -0,0 +1,162 @@
+---
+title: '@stacks/network'
+description: Constantes y utilidades de configuración de red para Stacks.
+---
+El `@stacks/network` El paquete exporta configuraciones de red y funciones auxiliares para trabajar con diferentes redes de Stacks.
+
+## Instalación
+
+```package-install
+@stacks/network
+```
+
+## Constantes de red
+
+### STACKS\_MAINNET
+
+`STACKS_MAINNET` proporciona la configuración de la red mainnet.
+
+```typescript
+import { STACKS_MAINNET } from '@stacks/network';
+
+console.log(STACKS_MAINNET);
+// {
+// chainId: 1,
+// transactionVersion: 0,
+// peerNetworkId: 385875968,
+// magicBytes: "X2",
+// bootAddress: "SP000000000000000000002Q6VF78",
+// addressVersion: {
+// singleSig: 22,
+// multiSig: 20,
+// },
+// client: {
+// baseUrl: "https://api.mainnet.hiro.so",
+// },
+// }
+```
+
+### STACKS\_TESTNET
+
+`STACKS_TESTNET` proporciona la configuración de la red testnet.
+
+```typescript
+import { STACKS_TESTNET } from '@stacks/network';
+
+console.log(STACKS_TESTNET.chainId); // 2147483648
+```
+
+### STACKS\_DEVNET / STACKS\_MOCKNET
+
+`STACKS_DEVNET` proporciona la configuración de red devnet.
+
+```typescript
+import { STACKS_DEVNET, STACKS_MOCKNET } from '@stacks/network';
+
+// Use in transactions
+import { makeSTXTokenTransfer } from '@stacks/transactions';
+
+const tx = await makeSTXTokenTransfer({
+ network: STACKS_DEVNET, // or STACKS_MOCKNET
+ // ... other options
+});
+```
+
+## networkFromName \[#networkFromName]
+
+`networkFromName` devuelve una configuración de red para una cadena de nombre dada.
+
+### Firma
+
+```typescript
+function networkFromName(name: 'mainnet' | 'testnet' | 'devnet' | 'mocknet'): StacksNetwork
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `name` | `'mainnet' \| 'testnet' \| 'devnet' \| 'mocknet'` | Sí | Nombre de la red |
+
+### Ejemplos
+
+```typescript
+import { networkFromName } from '@stacks/network';
+
+const mainnet = networkFromName('mainnet'); // Same as STACKS_MAINNET
+const testnet = networkFromName('testnet'); // Same as STACKS_TESTNET
+const devnet = networkFromName('devnet'); // Same as STACKS_DEVNET
+const mocknet = networkFromName('mocknet'); // Same as STACKS_MOCKNET
+```
+
+### Uso con transacciones
+
+```typescript
+import { networkFromName } from '@stacks/network';
+import { makeContractCall } from '@stacks/transactions';
+
+const network = networkFromName('testnet');
+
+const tx = await makeContractCall({
+ network,
+ contractAddress: 'ST2ZRX0K27GW0SP3GJCEMHD95TQGJMKB7G9Y0X1MH',
+ contractName: 'hello-world',
+ functionName: 'say-hi',
+ functionArgs: [],
+ senderKey: privateKey
+});
+```
+
+## clienteDeRed \[#clienteDeRed]
+
+`clientFromNetwork` extrae la configuración del cliente de API de una red.
+
+### Firma
+
+```typescript
+function clientFromNetwork(network: StacksNetwork): Required
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `network` | `StacksNetwork` | Sí | Objeto de configuración de red |
+
+### Ejemplo
+
+```typescript
+import { clientFromNetwork, STACKS_MAINNET } from '@stacks/network';
+
+const client = clientFromNetwork(STACKS_MAINNET);
+console.log(client.baseUrl); // 'https://api.mainnet.hiro.so'
+
+// Use with custom fetch
+const customClient = {
+ ...client,
+ fetch: customFetchFunction
+};
+```
+
+## Propiedades de configuración de red
+
+Todas las constantes de red comparten estas propiedades:
+
+| Propiedad | Tipo | Descripción |
+|-----------|------|-------------|
+| `chainId` | número | Identificador único para la red |
+| `transactionVersion` | número | Versión de serialización de transacción |
+| `peerNetworkId` | número | identificador de red P2P |
+| `magicBytes` | cadena | Bytes mágicos de red para serialización |
+| `bootAddress` | cadena | Dirección del contrato de arranque |
+
+## Valores predeterminados
+
+El paquete también exporta valores de configuración predeterminados:
+
+```typescript
+import { DEFAULT_CHAIN_ID, DEFAULT_TRANSACTION_VERSION } from '@stacks/network';
+
+console.log(DEFAULT_CHAIN_ID); // 1
+console.log(DEFAULT_TRANSACTION_VERSION); // 0
+```
diff --git a/content/docs/es/reference/stacks.js/packages/sbtc.mdx b/content/docs/es/reference/stacks.js/packages/sbtc.mdx
new file mode 100644
index 000000000..459bb95d7
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/packages/sbtc.mdx
@@ -0,0 +1,321 @@
+---
+title: 'sbtc'
+description: Construye y gestiona depósitos y retiros de sBTC en Bitcoin y Stacks.
+---
+El `sbtc` El paquete proporciona funciones para crear depósitos de sBTC en Bitcoin e interactuar con el protocolo sBTC a través de las redes de Bitcoin y Stacks.
+
+## Instalación
+
+```package-install
+sbtc
+```
+
+## Funciones de depósito
+
+### buildSbtcDepositAddress \[#buildSbtcDepositAddress]
+
+`buildSbtcDepositAddress` crea una dirección de Bitcoin para depósitos de sBTC con metadatos incorporados.
+
+### Firma
+
+```typescript
+function buildSbtcDepositAddress(options: DepositAddressOptions): DepositAddress
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `stacksAddress` | `string` | Sí | Dirección de Stacks para recibir sBTC |
+| `signersPublicKey` | `string` | Sí | Clave pública agregada de los firmantes |
+| `maxSignerFee` | `number` | No | Tarifa máxima para firmantes (predeterminado: 80,000 sats) |
+| `reclaimLockTime` | `number` | No | Tiempo de bloqueo para el script de recuperación (predeterminado: 6.000) |
+| `network` | `BitcoinNetwork` | No | Red de Bitcoin a utilizar (predeterminado: MAINNET) |
+
+### Ejemplo
+
+```typescript
+import { buildSbtcDepositAddress, SbtcApiClientMainnet } from 'sbtc';
+
+const client = new SbtcApiClientMainnet();
+
+// Build deposit address
+const deposit = buildSbtcDepositAddress({
+ stacksAddress: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ signersPublicKey: await client.fetchSignersPublicKey(),
+ maxSignerFee: 80_000, // Fee taken from deposit amount
+ reclaimLockTime: 6_000
+});
+
+// Send BTC to deposit.address using any Bitcoin wallet
+const txid = await wallet.sendTransfer({
+ recipient: deposit.address,
+ amount: 1_000_000 // 0.01 BTC
+});
+
+// Notify signers about the deposit
+await client.notifySbtc({ txid, ...deposit });
+```
+
+### buildSbtcDepositTx \[#buildSbtcDepositTx]
+
+`buildSbtcDepositTx` crea una transacción completa de Bitcoin para depósitos de sBTC.
+
+### Firma
+
+```typescript
+function buildSbtcDepositTx(options: DepositTxOptions): DepositTransaction
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `amountSats` | `number \| bigint` | Sí | Cantidad a depositar en satoshis |
+| `stacksAddress` | `string` | Sí | Dirección de Stacks para recibir sBTC |
+| `signersPublicKey` | `string` | Sí | Clave pública agregada de los firmantes |
+| `maxSignerFee` | `number` | No | Tarifa máxima para firmantes (predeterminado: 80,000 sats) |
+| `reclaimLockTime` | `number` | No | Tiempo de bloqueo para el script de recuperación (predeterminado: 144) |
+| `network` | `BitcoinNetwork` | No | Red de Bitcoin a utilizar |
+
+### Ejemplo
+
+```typescript
+import { buildSbtcDepositTx, SbtcApiClientMainnet } from 'sbtc';
+
+const client = new SbtcApiClientMainnet();
+
+// Build deposit transaction
+const deposit = buildSbtcDepositTx({
+ amountSats: 100_000,
+ stacksAddress: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ signersPublicKey: await client.fetchSignersPublicKey()
+});
+
+// Sign transaction
+deposit.transaction.sign(privateKey);
+deposit.transaction.finalize();
+
+// Broadcast and notify
+const txid = await client.broadcastTx(deposit.transaction);
+await client.notifySbtc(deposit);
+```
+
+### sbtcDepositHelper \[#sbtcDepositHelper]
+
+`sbtcDepositHelper` crea una transacción de depósito completamente formada a partir de UTXOs.
+
+### Firma
+
+```typescript
+function sbtcDepositHelper(options: DepositHelperOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `amountSats` | `number \| bigint` | Sí | Cantidad a depositar en satoshis |
+| `stacksAddress` | `string` | Sí | Dirección de Stacks para recibir sBTC |
+| `signersPublicKey` | `string` | Sí | Clave pública agregada de los firmantes |
+| `feeRate` | `number` | Sí | Tasa de comisión en sat/vbyte |
+| `utxos` | `UtxoWithTx[]` | Sí | UTXOs para financiar la transacción |
+| `bitcoinChangeAddress` | `string` | Sí | Dirección para el cambio de salida |
+| `reclaimPublicKey` | `string` | No | Clave pública para reclamar depósitos |
+| `reclaimLockTime` | `number` | No | Tiempo de bloqueo para reclamar (predeterminado: 144) |
+| `maxSignerFee` | `number` | No | Tarifa máxima del firmante (predeterminado: 80,000) |
+| `network` | `BitcoinNetwork` | No | Red de Bitcoin (predeterminado: MAINNET) |
+
+### Ejemplo
+
+```typescript
+import { sbtcDepositHelper, SbtcApiClientMainnet } from 'sbtc';
+
+const client = new SbtcApiClientMainnet();
+const btcAddress = 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4';
+
+// Create complete deposit transaction
+const deposit = await sbtcDepositHelper({
+ amountSats: 1_000_000,
+ stacksAddress: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ signersPublicKey: await client.fetchSignersPublicKey(),
+ feeRate: await client.fetchFeeRate('medium'),
+ utxos: await client.fetchUtxos(btcAddress),
+ bitcoinChangeAddress: btcAddress
+});
+
+// Sign and broadcast
+deposit.transaction.sign(privateKey);
+deposit.transaction.finalize();
+
+const txid = await client.broadcastTx(deposit.transaction);
+await client.notifySbtc(deposit);
+```
+
+## Clientes de API
+
+### SbtcApiClientMainnet
+
+`SbtcApiClientMainnet` proporciona acceso a la API de la red principal para operaciones de sBTC.
+
+```typescript
+import { SbtcApiClientMainnet } from 'sbtc';
+
+const client = new SbtcApiClientMainnet();
+```
+
+### SbtcApiClientTestnet
+
+`SbtcApiClientTestnet` proporciona acceso a la API de testnet para operaciones de sBTC.
+
+```typescript
+import { SbtcApiClientTestnet } from 'sbtc';
+
+const client = new SbtcApiClientTestnet();
+```
+
+### SbtcApiClientDevenv
+
+`SbtcApiClientDevenv` proporciona acceso a la API de desarrollo local.
+
+```typescript
+import { SbtcApiClientDevenv } from 'sbtc';
+
+const client = new SbtcApiClientDevenv();
+```
+
+## Métodos del cliente
+
+### fetchSignersPublicKey \[#fetchSignersPublicKey]
+
+`fetchSignersPublicKey` recupera la clave pública agregada de los firmantes de sBTC.
+
+```typescript
+const publicKey = await client.fetchSignersPublicKey();
+// '02abc123...' (32-byte hex string)
+```
+
+### fetchSignersAddress \[#fetchSignersAddress]
+
+`fetchSignersAddress` recupera la dirección de Bitcoin de los firmantes de sBTC.
+
+```typescript
+const address = await client.fetchSignersAddress();
+// 'bc1p...' (p2tr address)
+```
+
+### fetchFeeRate \[#fetchFeeRate]
+
+`fetchFeeRate` recupera las tarifas actuales de la red Bitcoin.
+
+```typescript
+const feeRate = await client.fetchFeeRate('medium');
+// 15 (sat/vbyte)
+
+// Also supports 'low' and 'high'
+const lowFee = await client.fetchFeeRate('low');
+const highFee = await client.fetchFeeRate('high');
+```
+
+### fetchUtxos \[#fetchUtxos]
+
+`fetchUtxos` recupera las salidas de transacciones no gastadas para una dirección de Bitcoin.
+
+```typescript
+const utxos = await client.fetchUtxos('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4');
+// Array of UTXOs with transaction data
+```
+
+### broadcastTx \[#broadcastTx]
+
+`broadcastTx` transmite una transacción de Bitcoin a la red.
+
+```typescript
+const txid = await client.broadcastTx(transaction);
+// '0x1234abcd...'
+```
+
+### notificarSbtc \[#notifySbtc]
+
+`notifySbtc` notifica a la API de sBTC sobre una transacción de depósito.
+
+```typescript
+const response = await client.notifySbtc({
+ txid,
+ stacksAddress,
+ reclaimScript,
+ depositScript
+});
+// { status: 200, statusMessage: 'OK' }
+```
+
+### fetchSbtcBalance \[#fetchSbtcBalance]
+
+`fetchSbtcBalance` recupera el saldo de sBTC para una dirección de Stacks.
+
+```typescript
+const balance = await client.fetchSbtcBalance('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159');
+// 1000000n (in micro-sBTC)
+```
+
+## Configuración
+
+### Opciones de configuración del cliente
+
+| Nombre | Tipo | Descripción |
+|--------|------|-------------|
+| `sbtcContract` | `string` | Dirección del contrato sBTC |
+| `sbtcApiUrl` | `string` | URL base de la API de sBTC (Emily) |
+| `btcApiUrl` | `string` | URL base de la API de Bitcoin |
+| `stxApiUrl` | `string` | URL base de la API de Stacks |
+
+### Configuración personalizada del cliente
+
+```typescript
+import { SbtcApiClient } from 'sbtc';
+
+const client = new SbtcApiClient({
+ sbtcContract: 'SP000000000000000000002Q6VF78.sbtc',
+ sbtcApiUrl: 'https://api.sbtc.tech',
+ btcApiUrl: 'https://mempool.space/api',
+ stxApiUrl: 'https://api.mainnet.hiro.so'
+});
+```
+
+## Ejemplo completo de depósito
+
+```typescript
+import { sbtcDepositHelper, SbtcApiClientMainnet } from 'sbtc';
+
+async function depositBtcForSbtc() {
+ const client = new SbtcApiClientMainnet();
+ const btcAddress = 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4';
+ const stxAddress = 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159';
+
+ // 1. Create deposit transaction
+ const deposit = await sbtcDepositHelper({
+ amountSats: 100_000,
+ stacksAddress: stxAddress,
+ signersPublicKey: await client.fetchSignersPublicKey(),
+ feeRate: await client.fetchFeeRate('medium'),
+ utxos: await client.fetchUtxos(btcAddress),
+ bitcoinChangeAddress: btcAddress
+ });
+
+ // 2. Sign transaction
+ deposit.transaction.sign(privateKey);
+ deposit.transaction.finalize();
+
+ // 3. Broadcast to Bitcoin network
+ const txid = await client.broadcastTx(deposit.transaction);
+ console.log('Bitcoin transaction:', txid);
+
+ // 4. Notify sBTC signers
+ await client.notifySbtc(deposit);
+ console.log('Deposit submitted successfully');
+
+ // 5. Check sBTC balance (after confirmation)
+ const balance = await client.fetchSbtcBalance(stxAddress);
+ console.log('sBTC balance:', balance);
+}
+```
diff --git a/content/docs/es/reference/stacks.js/packages/transactions.mdx b/content/docs/es/reference/stacks.js/packages/transactions.mdx
new file mode 100644
index 000000000..0d8282277
--- /dev/null
+++ b/content/docs/es/reference/stacks.js/packages/transactions.mdx
@@ -0,0 +1,524 @@
+---
+title: '@stacks/transactions'
+description: Construye, decodifica y transmite transacciones para la cadena de bloques Stacks.
+---
+El `@stacks/transactions` El paquete proporciona funcionalidad integral para crear, firmar y transmitir transacciones en la cadena de bloques de Stacks, incluyendo transferencias de STX, implementaciones de contratos y llamadas a contratos.
+
+## Instalación
+
+```package-install
+@stacks/transactions
+```
+
+## Funciones de transacción
+
+### makeSTXTokenTransfer \[#makeSTXTokenTransfer]
+
+`makeSTXTokenTransfer` crea una transacción de transferencia de tokens STX firmada.
+
+### Firma
+
+```typescript
+function makeSTXTokenTransfer(options: SignedTokenTransferOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `recipient` | `string` | Sí | Dirección STX del destinatario |
+| `amount` | `bigint` | Sí | Cantidad a transferir en microSTX |
+| `senderKey` | `string` | Sí | Clave privada del remitente |
+| `network` | `StacksNetwork \| string` | Sí | Configuración de red |
+| `memo` | `string` | No | Campo de memo opcional |
+| `fee` | `bigint` | No | Tarifa de transacción en microSTX |
+| `nonce` | `bigint` | No | Nonce de cuenta |
+| `anchorMode` | `AnchorMode` | No | Modo de anclaje de bloques |
+
+### Ejemplos
+
+#### Transferencia básica
+
+```typescript
+import { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';
+
+const transaction = await makeSTXTokenTransfer({
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ amount: 1000000n, // 1 STX in microSTX
+ senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',
+ network: 'mainnet'
+});
+
+const response = await broadcastTransaction({ transaction, network: 'mainnet' });
+console.log(response.txid);
+```
+
+#### Transferencia con memo
+
+```typescript
+const transaction = await makeSTXTokenTransfer({
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ amount: 2500000n,
+ memo: 'Payment for services',
+ senderKey: privateKey,
+ network: 'testnet'
+});
+```
+
+### makeUnsignedSTXTokenTransfer \[#makeUnsignedSTXTokenTransfer]
+
+`makeUnsignedSTXTokenTransfer` crea una transacción de transferencia de tokens STX sin firmar.
+
+### Firma
+
+```typescript
+function makeUnsignedSTXTokenTransfer(options: UnsignedTokenTransferOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `recipient` | `string` | Sí | Dirección STX del destinatario |
+| `amount` | `bigint` | Sí | Cantidad a transferir en microSTX |
+| `publicKey` | `string` | Sí | Clave pública del remitente |
+| `network` | `StacksNetwork \| string` | Sí | Configuración de red |
+| `memo` | `string` | No | Campo de memo opcional |
+| `fee` | `bigint` | No | Tarifa de transacción en microSTX |
+| `nonce` | `bigint` | No | Nonce de cuenta |
+
+### Ejemplo
+
+```typescript
+import { makeUnsignedSTXTokenTransfer } from '@stacks/transactions';
+
+const unsignedTx = await makeUnsignedSTXTokenTransfer({
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ amount: 1000000n,
+ publicKey: publicKeyString,
+ network: 'mainnet'
+});
+```
+
+### makeContractDeploy \[#makeContractDeploy]
+
+`makeContractDeploy` crea una transacción de despliegue de contrato inteligente firmada.
+
+### Firma
+
+```typescript
+function makeContractDeploy(options: SignedContractDeployOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `contractName` | `string` | Sí | Nombre para el contrato |
+| `codeBody` | `string` | Sí | Código fuente del contrato Clarity |
+| `senderKey` | `string` | Sí | Clave privada del implementador |
+| `network` | `StacksNetwork \| string` | Sí | Configuración de red |
+| `clarityVersion` | `ClarityVersion` | No | Versión de Clarity (por defecto la más reciente) |
+| `fee` | `bigint` | No | Tarifa de transacción en microSTX |
+| `nonce` | `bigint` | No | Nonce de cuenta |
+
+### Ejemplos
+
+#### Desplegar un contrato
+
+```typescript
+import { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';
+import { readFileSync } from 'fs';
+
+const codeBody = readFileSync('./contract.clar', 'utf-8');
+
+const transaction = await makeContractDeploy({
+ contractName: 'my-contract',
+ codeBody,
+ senderKey: privateKey,
+ network: 'testnet'
+});
+
+const response = await broadcastTransaction({ transaction, network: 'testnet' });
+```
+
+#### Implementar con la versión de Clarity
+
+```typescript
+const transaction = await makeContractDeploy({
+ contractName: 'clarity-v3-contract',
+ codeBody: contractCode,
+ clarityVersion: 3,
+ senderKey: privateKey,
+ network: 'mainnet'
+});
+```
+
+### makeContractCall \[#makeContractCall]
+
+`makeContractCall` crea una transacción de llamada de función de contrato firmada.
+
+### Firma
+
+```typescript
+function makeContractCall(options: SignedContractCallOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `contractAddress` | `string` | Sí | Dirección del contrato |
+| `contractName` | `string` | Sí | Nombre del contrato |
+| `functionName` | `string` | Sí | Función a llamar |
+| `functionArgs` | `ClarityValue[]` | Sí | Argumentos de función |
+| `senderKey` | `string` | Sí | Clave privada del llamante |
+| `network` | `StacksNetwork \| string` | Sí | Configuración de red |
+| `postConditions` | `PostCondition[]` | No | Condiciones posteriores |
+| `validateWithAbi` | `boolean \| ClarityAbi` | No | Validar argumentos contra ABI |
+| `fee` | `bigint` | No | Tarifa de transacción en microSTX |
+| `nonce` | `bigint` | No | Nonce de cuenta |
+
+### Ejemplos
+
+#### Llamada básica a contrato
+
+```typescript
+import { makeContractCall, broadcastTransaction, Cl } from '@stacks/transactions';
+
+const transaction = await makeContractCall({
+ contractAddress: 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR',
+ contractName: 'hello-world',
+ functionName: 'say-hi',
+ functionArgs: [Cl.stringUtf8('Hello!')],
+ senderKey: privateKey,
+ network: 'testnet'
+});
+
+const response = await broadcastTransaction({ transaction, network: 'testnet' });
+```
+
+#### Llamada con condiciones posteriores
+
+```typescript
+import { makeContractCall, Cl, Pc } from '@stacks/transactions';
+
+const postCondition = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')
+ .willSendLte(1000000n)
+ .ustx();
+
+const transaction = await makeContractCall({
+ contractAddress: 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR',
+ contractName: 'token-contract',
+ functionName: 'transfer',
+ functionArgs: [
+ Cl.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159'),
+ Cl.uint(100n)
+ ],
+ postConditions: [postCondition],
+ validateWithAbi: true,
+ senderKey: privateKey,
+ network: 'mainnet'
+});
+```
+
+### sponsorTransaction \[#sponsorTransaction]
+
+`sponsorTransaction` agrega una firma de patrocinador a una transacción, permitiendo transacciones patrocinadas.
+
+### Firma
+
+```typescript
+function sponsorTransaction(options: SponsorTransactionOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `transaction` | `StacksTransaction` | Sí | Transacción a patrocinar |
+| `sponsorPrivateKey` | `string` | Sí | Clave privada del patrocinador |
+| `fee` | `bigint` | Sí | Tarifa a ser pagada por el patrocinador |
+| `sponsorNonce` | `bigint` | No | Nonce de la cuenta del patrocinador |
+
+### Ejemplo
+
+```typescript
+import { sponsorTransaction, deserializeTransaction, broadcastTransaction } from '@stacks/transactions';
+
+// Deserialize the transaction from the origin
+const deserializedTx = deserializeTransaction(serializedTx);
+
+// Sponsor the transaction
+const sponsoredTx = await sponsorTransaction({
+ transaction: deserializedTx,
+ sponsorPrivateKey: sponsorKey,
+ fee: 1000n,
+ sponsorNonce: 0
+});
+
+const response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });
+```
+
+### fetchCallReadOnlyFunction \[#fetchCallReadOnlyFunction]
+
+`fetchCallReadOnlyFunction` llama a una función de contrato de solo lectura sin crear una transacción.
+
+### Firma
+
+```typescript
+function fetchCallReadOnlyFunction(options: CallReadOnlyFunctionOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `contractAddress` | `string` | Sí | Dirección del contrato |
+| `contractName` | `string` | Sí | Nombre del contrato |
+| `functionName` | `string` | Sí | Función a llamar |
+| `functionArgs` | `ClarityValue[]` | Sí | Argumentos de función |
+| `network` | `StacksNetwork` | Sí | Configuración de red |
+| `senderAddress` | `string` | Sí | Dirección del llamante |
+
+### Ejemplo
+
+```typescript
+import { fetchCallReadOnlyFunction, Cl } from '@stacks/transactions';
+import { STACKS_MAINNET } from '@stacks/network';
+
+const result = await fetchCallReadOnlyFunction({
+ contractAddress: 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR',
+ contractName: 'data-store',
+ functionName: 'get-value',
+ functionArgs: [Cl.stringUtf8('key')],
+ network: STACKS_MAINNET,
+ senderAddress: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159'
+});
+
+console.log(result);
+```
+
+### broadcastTransaction \[#broadcastTransaction]
+
+`broadcastTransaction` transmite una transacción firmada a la red.
+
+### Firma
+
+```typescript
+function broadcastTransaction(options: BroadcastTransactionOptions): Promise
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `transaction` | `StacksTransaction` | Sí | Transacción firmada para transmitir |
+| `network` | `StacksNetwork \| string` | Sí | Red a la que transmitir |
+
+### Ejemplo
+
+```typescript
+import { broadcastTransaction } from '@stacks/transactions';
+
+const result = await broadcastTransaction({
+ transaction: signedTx,
+ network: 'mainnet'
+});
+
+if (result.error) {
+ console.error('Broadcast failed:', result.reason);
+} else {
+ console.log('Transaction ID:', result.txid);
+}
+```
+
+## Construcción de valor de claridad
+
+### Valores primitivos
+
+```typescript
+import { Cl } from '@stacks/transactions';
+
+// Boolean values
+const isTrue = Cl.bool(true);
+const isFalse = Cl.bool(false);
+
+// Integer values (signed 128-bit)
+const positiveInt = Cl.int(42n);
+const negativeInt = Cl.int(-100n);
+
+// Unsigned integer values (unsigned 128-bit)
+const unsignedInt = Cl.uint(100n);
+
+// Buffer values
+const buffer = Cl.bufferFromUtf8('hello world');
+const hexBuffer = Cl.bufferFromHex('0x1234');
+
+// String values
+const asciiStr = Cl.stringAscii('Hello ASCII');
+const utf8Str = Cl.stringUtf8('Hello UTF-8! 👋');
+```
+
+### Valores complejos
+
+```typescript
+// Principal values
+const standardPrincipal = Cl.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159');
+const contractPrincipal = Cl.contractPrincipal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', 'my-contract');
+
+// Optional values
+const none = Cl.none();
+const some = Cl.some(Cl.uint(42n));
+
+// Response values
+const okResponse = Cl.ok(Cl.stringUtf8('Success'));
+const errResponse = Cl.error(Cl.uint(404n));
+
+// Tuple values
+const tuple = Cl.tuple({
+ name: Cl.stringUtf8('Alice'),
+ age: Cl.uint(30n),
+ active: Cl.bool(true)
+});
+
+// List values
+const list = Cl.list([Cl.uint(1n), Cl.uint(2n), Cl.uint(3n)]);
+```
+
+## Postcondiciones
+
+### Condiciones posteriores de STX
+
+```typescript
+import { Pc } from '@stacks/transactions';
+
+// Standard principal STX post condition
+const stxPostCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159')
+ .willSendGte(1000000n)
+ .ustx();
+
+// Contract principal STX post condition
+const contractStxCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159.my-contract')
+ .willSendEq(500000n)
+ .ustx();
+```
+
+### Condiciones posteriores de tokens fungibles
+
+```typescript
+// Standard principal fungible token post condition
+const ftPostCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159')
+ .willSendLte(100n)
+ .ft('SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.token-contract', 'my-token');
+
+// Contract principal fungible token post condition
+const contractFtCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159.vault')
+ .willNotSend()
+ .ft('SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.token-contract', 'my-token');
+```
+
+### Condiciones posteriores de tokens no fungibles
+
+```typescript
+// Standard principal NFT post condition
+const nftPostCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159')
+ .willSend()
+ .nft('SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.nft-contract', 'my-nft', Cl.uint(1n));
+
+// Contract principal NFT post condition
+const contractNftCondition = Pc.principal('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159.marketplace')
+ .willNotSend()
+ .nft('SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.nft-contract', 'my-nft', Cl.uint(1n));
+```
+
+## Transacciones de firma múltiple
+
+Las transacciones de firma múltiple requieren múltiples firmas antes de ser transmitidas.
+
+```typescript
+import {
+ makeUnsignedSTXTokenTransfer,
+ createStacksPrivateKey,
+ deserializeTransaction,
+ pubKeyfromPrivKey,
+ publicKeyToString,
+ TransactionSigner,
+ BytesReader
+} from '@stacks/transactions';
+
+// Create unsigned multi-sig transaction
+const transaction = await makeUnsignedSTXTokenTransfer({
+ recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',
+ amount: 1000000n,
+ fee: 200n,
+ numSignatures: 2, // Require 2 of 3 signatures
+ publicKeys: [publicKey1, publicKey2, publicKey3],
+ network: 'mainnet'
+});
+
+// Sign with multiple parties
+const deserializedTx = deserializeTransaction(transaction.serialize());
+const signer = new TransactionSigner(deserializedTx);
+
+// Add required signatures
+signer.signOrigin(privateKey1);
+signer.signOrigin(privateKey2);
+
+// Append public key of non-signing party
+signer.appendOrigin(publicKey3);
+
+// Broadcast the multi-sig transaction
+const signedTx = deserializedTx;
+const response = await broadcastTransaction({ transaction: signedTx, network: 'mainnet' });
+```
+
+## Utilidades de generación de claves
+
+### randomPrivateKey \[#randomPrivateKey]
+
+`randomPrivateKey` genera una nueva clave privada aleatoria.
+
+```typescript
+import { randomPrivateKey } from '@stacks/transactions';
+
+const privateKey = randomPrivateKey();
+console.log(privateKey); // Random 32-byte hex string with optional compression flag
+```
+
+### privateKeyToPublicKey \[#privateKeyToPublicKey]
+
+`privateKeyToPublicKey` deriva una clave pública a partir de una clave privada.
+
+```typescript
+import { privateKeyToPublicKey } from '@stacks/transactions';
+
+const privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';
+const publicKey = privateKeyToPublicKey(privateKey);
+console.log(publicKey); // Compressed public key
+```
+
+## Funciones de utilidad
+
+### deserializarTransacción \[#deserializeTransaction]
+
+`deserializeTransaction` convierte una transacción serializada de vuelta a un objeto de transacción.
+
+```typescript
+import { deserializeTransaction } from '@stacks/transactions';
+
+const serializedTx = '0x00000000...'; // Hex string
+const transaction = deserializeTransaction(serializedTx);
+```
+
+### cvToJSON \[#cvToJSON]
+
+`cvToJSON` convierte valores de Clarity a formato JSON para una manipulación más fácil.
+
+```typescript
+import { cvToJSON, hexToCV } from '@stacks/transactions';
+
+const clarityValue = hexToCV('0x0100000000000000000000000000000001');
+const json = cvToJSON(clarityValue);
+console.log(json); // { type: 'uint', value: '1' }
+```
diff --git a/content/docs/es/resources/archive/download-guide.mdx b/content/docs/es/resources/archive/download-guide.mdx
new file mode 100644
index 000000000..08141c98e
--- /dev/null
+++ b/content/docs/es/resources/archive/download-guide.mdx
@@ -0,0 +1,200 @@
+---
+title: Cómo descargar los archivos de Hiro
+description: Guía completa para descargar archivos de archivo grandes de manera confiable con consejos para solucionar problemas.
+---
+## Visión general
+
+Los archivos de Hiro Archive son grandes conjuntos de datos (que van desde varios GB hasta varios *cien* ES) alojado en Google Cloud Storage. Debido a su tamaño, las descargas pueden verse interrumpidas por problemas de red, límites de velocidad o tiempos de espera de conexión. Esta guía proporciona múltiples métodos de descarga y soluciones para resolver problemas.
+
+## Tamaños y requisitos de archivos
+
+Antes de descargar, asegúrate de tener suficiente:
+
+* **Espacio en disco**: Los archivos van desde 10GB (APIs) hasta varios cientos de GB+ (datos de blockchain)
+* **Ancho de banda**: Las descargas pueden tardar horas o días dependiendo de tu conexión
+* **Almacenamiento para extracción**: Los archivos comprimidos se expanden significativamente cuando se extraen
+
+## Métodos de descarga
+
+### Método 1: wget con reanudación (Recomendado para la mayoría de los usuarios)
+
+El `wget` comando con el `-c` la bandera permite reanudar descargas interrumpidas:
+
+:::callout
+type: info
+
+### Usuarios de macOS
+
+Es posible que necesite instalar wget primero: `brew install wget`. Alternativamente, utilice el método curl que se muestra a continuación, el cual viene preinstalado en macOS.
+:::
+
+```terminal
+$ wget -c https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+$ wget -c --progress=bar:force:noscroll https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+```
+
+**Ventajas:**
+
+* Reanuda automáticamente las descargas interrumpidas
+* Incorporado en la mayoría de los sistemas Unix
+* Fácil de usar
+
+**Desventajas:**
+
+* Descargas de un solo hilo
+* Aún puede experimentar reinicios de conexión
+
+### Método 2: curl con reintentos
+
+Usar `curl` con reintentos automáticos para descargas robustas. El `--continue-at -` la bandera reanuda las descargas parciales, mientras que `--output` especifica el nombre del archivo:
+
+```terminal
+$ curl --continue-at - --retry 10 --retry-delay 5 --retry-max-time 0 \
+ --progress-bar \
+ --output mainnet-stacks-blockchain-latest.tar.gz \
+ https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz
+```
+
+**Ventajas:**
+
+* Mecanismo de reintento automático
+* Reanudar capacidad con `-C -`
+* Más opciones de configuración
+
+### Método 3: gcloud storage cp (El más rápido, requiere autenticación)
+
+Google Cloud CLI proporciona las velocidades de descarga más rápidas con transferencias paralelas. Primero autentícate con `gcloud auth login`, luego descargue el archivo al disco o transmita directamente a la extracción:
+
+#### Descargar archivo al directorio actual
+
+```terminal
+$ gcloud storage cp gs://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz .
+```
+
+#### O transmitir directamente a la extracción (ahorra espacio en disco pero es más lento debido a la descarga secuencial)
+
+```terminal
+$ gcloud storage cp gs://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz - | tar -xz
+```
+
+**Ventajas:**
+
+* Descargas significativamente más rápidas (mejora de velocidad de 2 a 3 veces)
+* Transferencias paralelas incorporadas
+* Manejo automático de reintentos
+* Puede transmitir directamente a la extracción (útil cuando el espacio en disco es limitado, pero desactiva las transferencias paralelas)
+
+**Desventajas:**
+
+* Requiere autenticación de cuenta de Google
+* Se requiere la instalación de software adicional
+
+### Método 4: Gestores de descargas (JDownloader)
+
+Para usuarios que prefieren aplicaciones con interfaz gráfica o necesitan gestión avanzada de descargas:
+
+1. Descargar e instalar [JDownloader](https://jdownloader.org/download/index)
+2. Copie la URL del archivo en JDownloader
+3. Configurar conexiones paralelas para descargas más rápidas
+
+**Ventajas:**
+
+* Interfaz gráfica
+* Descarga en paralelo
+* Mecanismos avanzados de reintento
+* Soporte multiplataforma
+
+## Verificación y extracción
+
+Después de descargar, verifique la integridad del archivo:
+
+:::callout
+type: info
+
+### Disponibilidad de Suma de Comprobación
+
+SHA256 checksum files are available for **todos los archivos** para verificar la integridad de la descarga.
+:::
+
+1. **Descargue el archivo de suma de comprobación:**
+ ```terminal
+ $ wget https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.sha256
+ ```
+
+2. **Verifique la descarga:**
+ ```terminal
+ $ echo "$(cat mainnet-stacks-blockchain-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-latest.tar.gz" | shasum -a 256 -c
+ ```
+
+3. **Extraer el archivo:**
+ ```terminal
+ $ tar -zxvf mainnet-stacks-blockchain-latest.tar.gz -C /target/directory
+ ```
+
+:::callout
+type: info
+
+### Extracción de archivos grandes
+
+El `marf.sqlite.blobs` El archivo puede ser muy grande y puede llevar un tiempo considerable extraerlo. Asegúrese de tener suficiente espacio en disco y sea paciente durante la extracción.
+:::
+
+## Consejos de rendimiento
+
+1. **Utiliza gcloud para las descargas más rápidas** - requiere autenticación pero proporciona mejoras significativas de velocidad
+2. **Descargar durante horas de menor demanda** - típicamente tarde en la noche o temprano en la mañana
+3. **Utilizar conexiones por cable** - evitar el Wi-Fi para descargas grandes cuando sea posible
+4. **Monitorear el espacio en disco** - los archivos extraídos pueden ser de 2 a 3 veces más grandes que los archivos comprimidos
+5. **Considere la extracción por transmisión** con gcloud para ahorrar espacio en disco
+
+## Preguntas frecuentes
+
+
+
+ ¿Por qué siguen fallando las descargas?
+
+
+ Las descargas de archivos grandes desde el almacenamiento en la nube pueden interrumpirse debido a problemas de red, limitación de velocidad o tiempos de espera de conexión. Utilice herramientas con capacidad de reanudación como `wget -c` o `gcloud storage cp`.
+
+
+
+
+ ¿Qué método de descarga debo usar?
+
+
+ Para obtener las velocidades más rápidas, use `gcloud storage cp` (requiere autenticación de Google). Para simplificar, use `wget -c`Para obtener fiabilidad sin autenticación, pruebe un gestor de descargas como JDownloader.
+
+
+
+
+ ¿Cuánto tiempo debería tardar una descarga?
+
+
+ El tiempo de descarga varía según el tamaño del archivo y la velocidad de conexión. El archivo de la cadena de bloques de la red principal (varios cientos de GB o más) puede tardar entre 6 y 24 horas o más en conexiones de banda ancha típicas.
+
+
+
+
+ ¿Puedo reanudar una descarga fallida?
+
+
+ Sí, use `wget -c`, `curl -C -`, o `gcloud storage cp` para reanudar las descargas interrumpidas desde donde se detuvieron.
+
+
+
+
+ ¿Por qué gcloud es más rápido?
+
+
+ Google Cloud CLI utiliza transferencias paralelas y protocolos optimizados al descargar desde Google Cloud Storage, lo que resulta en mejoras de velocidad de 2 a 3 veces.
+
+
+
+
+ ¿Necesito verificar los archivos descargados?
+
+
+ Yes, verify large downloads using SHA256 checksums to ensure data integrity.
+
+
+
diff --git a/content/docs/es/resources/archive/index.mdx b/content/docs/es/resources/archive/index.mdx
new file mode 100644
index 000000000..d308fc846
--- /dev/null
+++ b/content/docs/es/resources/archive/index.mdx
@@ -0,0 +1,15 @@
+---
+title: Archivo Hiro
+sidebarTitle: Visión general
+description: El Archivo Hiro es una serie de instantáneas de datos para servicios en el ecosistema de Stacks.
+llm: false
+---
+## Visión general
+
+El Archivo Hiro te permite iniciar rápidamente servicios compatibles con datos precargados, que de otro modo podrían llevarte días o semanas adquirir al sincronizar desde el génesis. Este es un servicio público que Hiro ofrece como un beneficio gratuito para la comunidad de Stacks.
+
+[Ver el Archivo de Hiro](https://archive.hiro.so/)
+
+## Instalación
+
+Ver el [descargar](/resources/archive/download-guide) guía para obtener instrucciones sobre cómo descargar los archivos de Hiro.
diff --git a/content/docs/es/resources/archive/meta.json b/content/docs/es/resources/archive/meta.json
new file mode 100644
index 000000000..e583e1c7d
--- /dev/null
+++ b/content/docs/es/resources/archive/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Hiro Archive",
+ "root": true,
+ "pages": ["index", "download-guide", "stacks-blockchain", "stacks-api", "token-metadata-api"]
+}
diff --git a/content/docs/es/resources/archive/stacks-api.mdx b/content/docs/es/resources/archive/stacks-api.mdx
new file mode 100644
index 000000000..83b12bf2d
--- /dev/null
+++ b/content/docs/es/resources/archive/stacks-api.mdx
@@ -0,0 +1,94 @@
+---
+title: Usar el archivo de la API de la cadena de bloques de Stacks
+description: Descubre cómo utilizar el Hiro Archive para poner en marcha una API de Stacks Blockchain.
+---
+## Requisitos previos
+
+Dado que la API de Stacks Blockchain depende de que un nodo de la cadena de bloques Stacks esté a la misma altura de bloque, primero deberá [restaurar un nodo de blockchain de Stacks utilizando el Archivo Hiro](/resources/archive/stacks-blockchain) antes de restaurar la API de Stacks Blockchain. De lo contrario, puede encontrar errores al ejecutar la API.
+
+Para que los archivos de la cadena de bloques Stacks y la API de la cadena de bloques Stacks sean compatibles, deben cumplir los siguientes criterios:
+
+* Ambos archivos corresponden a la misma red de Stacks (mainnet/testnet).
+* La versión del archivo API debe ser compatible con la versión del archivo de la cadena de bloques Stacks (Ver [Notas de la versión de la API](https://github.com/hirosystems/stacks-blockchain-api/releases) para orientación).
+* Ambos archivos fueron creados en la misma fecha.
+
+## Métodos de restauración
+
+Hay dos formas de restaurar una API de Stacks Blockchain utilizando el Archivo Hiro. El archivo que necesitará descargar dependerá de su método de restauración. No existe ningún escenario en el que necesite ambos métodos de restauración.
+
+**Restaurar mediante volcado de base de datos Postgres (Recomendado)**
+
+Este es el método más rápido y directo, y es adecuado para la mayoría de los escenarios. Consiste en una copia de seguridad de la base de datos Postgres de la API tomada utilizando `pg_dump`Por lo general, recomendamos comenzar con este método antes de intentar el método siguiente si este no funciona por alguna razón.
+
+**Restaurar mediante archivo de valores separados por tabulaciones (TSV)**
+
+Este método es varias veces más lento que la restauración desde un volcado de Postgres. El archivo TSV de la API contiene los eventos sin procesar en bruto de un nodo de la cadena de bloques de Stacks. La API puede ingerir este archivo para procesar eventos en una base de datos Postgres.
+La restauración desde un archivo TSV puede ser útil cuando no está disponible un archivo de base de datos Postgres para una versión particular de la API o cuando no se puede utilizar por cualquier motivo.
+
+## Dónde descargar archivos
+
+Dependiendo del método de restauración utilizado anteriormente, los archivos del Stacks Blockchain API para cada red se pueden encontrar en las siguientes ubicaciones:
+
+* Volcado de base de datos Postgres
+ * mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api-pg/
+ * testnet: https://archive.hiro.so/testnet/stacks-blockchain-api-pg/
+* Archivo TSV
+ * mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api/
+ * testnet: https://archive.hiro.so/testnet/stacks-blockchain-api/
+
+Los patrones de nombres de archivo son los siguientes:
+
+* Volcado de base de datos Postgres
+ * archivo: `stacks-blockchain-api-pg---.dump`
+ * shasum: `stacks-blockchain-api-pg---.sha256`
+* Archivo TSV
+ * archivo: `-stacks-blockchain-api--.gz`
+ * shasum: `-stacks-blockchain-api--.sha256`
+
+Existe un archivo y un shasum que se actualizan continuamente y siempre apuntan a la carga más reciente:
+
+* Volcado de base de datos Postgres
+ * archivo: `stacks-blockchain-api-pg--latest.dump`
+ * shasum: `stacks-blockchain-api-pg--latest.sha256`
+* Archivo TSV
+ * archivo: `-stacks-blockchain-api-latest.gz`
+ * shasum: `-stacks-blockchain-api-latest.sha256`
+
+o la carga más reciente para una versión en particular:
+
+* Volcado de base de datos Postgres
+ * archivo: `stacks-blockchain-api-pg---latest.dump`
+ * shasum: `stacks-blockchain-api-pg---latest.sha256`
+* Archivo TSV
+ * archivo: `-stacks-blockchain-api--latest.gz`
+ * shasum: `-stacks-blockchain-api--latest.sha256`
+
+## Restaurando la API de la cadena de bloques de Stacks utilizando el archivo de Hiro
+
+**Si se restaura mediante un volcado de Postgres**
+
+1. Descargue el archivo y el shasum para la red y el método de restauración apropiados.
+2. Verifique el archivo usando los pasos en el [descargar guía](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
+3. Importe el archivo de archivo en una base de datos Postgres en ejecución (puede tardar hasta una hora dependiendo de las especificaciones y la configuración de la base de datos):
+ ```terminal
+ $ export PGPASSWORD=
+ $ pg_restore --username postgres --verbose --jobs 4 --dbname stacks_blockchain_api /path/to/archive/file
+ ```
+4. Inicie el servicio de API de Stacks Blockchain.
+5. Verifique que el conjunto de datos se esté utilizando comparando sus nodos [altura del bloque local](http://localhost:3999/extended/v1/status) con [De Hiro](https://api.hiro.so/extended/v1/status)Si la altura del bloque coincide o está cerca de la altura del bloque de Hiro, la restauración fue exitosa.
+ 1. Es posible que el nodo local tarde unos minutos en responder en este punto final.
+ 2. Es posible que la altura de su bloque esté hasta unos cientos de bloques alejada de la de Hiro, dependiendo de la antigüedad del archivo. Debería ponerse al día relativamente rápido.
+
+**Si se restaura mediante archivo TSV**
+
+1. Descargue el archivo y el shasum para la red y el método de restauración apropiados.
+2. Verifique el archivo usando los pasos en el [descargar guía](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
+3. Extraiga el archivo en el directorio deseado:
+ ```terminal
+ $ gzip -d --stdout > /path/to/extracted/file
+ ```
+4. [Siga estas instrucciones](https://github.com/hirosystems/stacks-blockchain-api#export-and-import) para procesar e importar los eventos del archivo TSV en su base de datos Postgres.
+5. Inicie el servicio de API de Stacks Blockchain.
+6. Verifique que el conjunto de datos se esté utilizando comparando sus nodos [altura del bloque local](http://localhost:3999/extended/v1/status) con [De Hiro](https://api.hiro.so/extended/v1/status)Si la altura del bloque coincide o está cerca de la altura del bloque de Hiro, la restauración fue exitosa.
+ 1. Es posible que el nodo local tarde unos minutos en responder en este punto final.
+ 2. Es posible que la altura de su bloque esté hasta unos cientos de bloques alejada de la de Hiro, dependiendo de la antigüedad del archivo. Debería ponerse al día relativamente rápido.
diff --git a/content/docs/es/resources/archive/stacks-blockchain.mdx b/content/docs/es/resources/archive/stacks-blockchain.mdx
new file mode 100644
index 000000000..dacf30a69
--- /dev/null
+++ b/content/docs/es/resources/archive/stacks-blockchain.mdx
@@ -0,0 +1,48 @@
+---
+title: Utilizar el archivo de la cadena de bloques Stacks
+description: Descubre cómo utilizar el Hiro Archive para poner en marcha un nodo de Stacks.
+---
+## Dónde descargar archivos
+
+Los archivos de la cadena de bloques de Stacks para cada red se pueden encontrar en las siguientes ubicaciones:
+
+* mainnet: https://archive.hiro.so/mainnet/stacks-blockchain/
+* testnet: https://archive.hiro.so/testnet/stacks-blockchain/
+
+Los patrones de nombres de archivo son los siguientes:
+
+* archivo: `-stacks-blockchain--.tar.gz`
+* shasum: `-stacks-blockchain--.sha256`
+
+Existe un archivo y un shasum que se actualizan continuamente y siempre apuntan a la carga más reciente:
+
+* archivo: `-stacks-blockchain-latest.tar.gz`
+* shasum: `-stacks-blockchain-latest.sha256`
+
+o la carga más reciente para una versión en particular:
+
+* archivo: `-stacks-blockchain-2.3.0.0.2-latest.tar.gz`
+* shasum: `-stacks-blockchain-2.3.0.0.2-latest.sha256`
+
+## Restaurando un nodo de blockchain de Stacks utilizando el Archivo Hiro
+
+1. Descargue el archivo y el shasum para la red apropiada.
+
+:::callout
+type: info
+
+### Descargar Ayuda
+
+Los archivos son archivos grandes (321GB+ para mainnet) que pueden experimentar problemas de conexión. Para métodos de descarga detallados, solución de problemas y opciones de descarga más rápidas, consulte el [Cómo descargar los archivos de Hiro](/resources/archive/download-guide) guía.
+:::
+
+2. Verifique el archivo usando los pasos en el [descargar guía](/resources/archive/download-guide#verification-and-extraction).
+3. Extraiga el archivo en el directorio deseado:
+ ```terminal
+ $ tar -zxvf -C /target/directory
+ ```
+4. [Configurar el `working_dir` propiedad](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) en su archivo Config.toml del nodo de blockchain Stacks para que coincida con el directorio donde extrajo el archivo.
+5. Inicie su nodo de blockchain de Stacks. Puede usar [uno de estos archivos de configuración de ejemplo](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) como referencia.
+6. Verifique que el conjunto de datos se esté utilizando comparando sus nodos [altura del bloque local](http://localhost:20443/v2/info) con [De Hiro](https://api.hiro.so/v2/info)Si la altura del bloque coincide o está cerca de la altura del bloque de Hiro, la restauración fue exitosa.
+ 1. Es posible que el nodo local tarde unos minutos en responder en este punto final.
+ 2. Es posible que la altura de su bloque esté hasta unos cientos de bloques alejada de la de Hiro, dependiendo de la antigüedad del archivo. Debería ponerse al día relativamente rápido.
diff --git a/content/docs/es/resources/archive/token-metadata-api.mdx b/content/docs/es/resources/archive/token-metadata-api.mdx
new file mode 100644
index 000000000..e6b959dad
--- /dev/null
+++ b/content/docs/es/resources/archive/token-metadata-api.mdx
@@ -0,0 +1,44 @@
+---
+title: Usar el archivo de la API de metadatos de tokens
+description: Descubre cómo utilizar el Hiro Archive para poner en marcha una API de Metadatos de Tokens.
+---
+## Requisitos previos
+
+Dado que la API de metadatos de tokens depende de una API de Stacks Blockchain, primero deberá lanzar una API de Stacks Blockchain configurada para la misma red de Stacks.
+
+Si aún no tienes uno, puedes seguir [estas instrucciones](/resources/archive/stacks-blockchain) para lanzar uno con un archivo.
+
+## Dónde descargar archivos
+
+Los archivos de la API de metadatos de tokens para cada red se pueden encontrar en las siguientes ubicaciones:
+
+* mainnet: https://archive.hiro.so/mainnet/token-metadata-api-pg/
+* testnet: https://archive.hiro.so/testnet/token-metadata-api-pg/
+
+Los patrones de nombres de archivo son los siguientes:
+
+* archivo: `token-metadata-api-pg---.dump`
+* shasum: `token-metadata-api-pg---.sha256`
+
+Existe un archivo y un shasum que se actualizan continuamente y siempre apuntan a la carga más reciente:
+
+* archivo: `token-metadata-api-pg--latest.dump`
+* shasum: `token-metadata-api-pg--latest.sha256`
+
+o la carga más reciente para una versión en particular:
+
+* archivo: `token-metadata-api-pg---latest.dump`
+* shasum: `token-metadata-api-pg---latest.sha256`
+
+## Restaurando la API de metadatos de tokens utilizando el archivo de Hiro
+
+1. Descargue el archivo y el shasum para la red apropiada.
+2. Verifique el archivo usando los pasos en el [descargar guía](/resources/archive/download-guide#verification-and-extraction) (note: API archives may not have SHA256 files available).
+3. Importe el archivo de archivo en una base de datos Postgres en ejecución (puede tardar hasta una hora dependiendo de las especificaciones y la configuración de la base de datos):
+ ```terminal
+ $ export PGPASSWORD=
+ $ pg_restore --username postgres --verbose --jobs 4 --dbname token_metadata_api /path/to/archive/file
+ ```
+4. Inicie el servicio de API de metadatos de tokens.
+5. Verifique que la restauración se haya realizado correctamente visualizando el [número total de tokens y contratos rastreados en el servicio.](http://localhost:3000/metadata) Si el número total de cada propiedad es mayor que cero, la restauración fue exitosa.
+ 1. Es posible que el nodo local tarde unos minutos en responder en este punto final.
diff --git a/content/docs/es/resources/clarity/(integrations)/external-data.mdx b/content/docs/es/resources/clarity/(integrations)/external-data.mdx
new file mode 100644
index 000000000..cdd433463
--- /dev/null
+++ b/content/docs/es/resources/clarity/(integrations)/external-data.mdx
@@ -0,0 +1,222 @@
+---
+title: Uso de datos del oráculo Pyth
+sidebarTitle: Integración de Oracle
+description: En esta guía, aprenderás cómo leer datos de precios en tiempo real del oráculo descentralizado de Pyth Network en tus contratos de Clarity.
+---
+:::objectives
+* Comprender el modelo de oráculo basado en extracción de Pyth
+* Leer y procesar datos de alimentación de precios
+* Trabajar con representación de precios de punto fijo
+* Construir contratos inteligentes denominados en USD
+:::
+
+:::prerequisites
+* Comprensión básica de los contratos inteligentes de Clarity
+* Un proyecto de Clarinet configurado para desarrollo local
+:::
+
+## Entendiendo los oráculos de Pyth
+
+Pyth Network utiliza una **basado en pull** modelo de oráculo, diferente de los oráculos tradicionales basados en push:
+
+* **Modelo push**: Oracle envía continuamente actualizaciones de precios en la cadena
+* **Modelo de extracción**: Los usuarios obtienen y envían actualizaciones de precios cuando es necesario
+
+Este enfoque es más eficiente en cuanto al gas y permite actualizaciones de precios con mayor frecuencia.
+
+### Fuentes de precios admitidas
+
+La integración de Pyth en Stacks actualmente admite estos feeds de precios:
+
+| Activo | ID del Feed de Precios | Enlace del Explorador |
+|-------|--------------|---------------|
+| BTC/USD | `0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` | [Ver](https://www.pyth.network/price-feeds/crypto-btc-usd) |
+| STX/USD | `0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17` | [Ver](https://www.pyth.network/price-feeds/crypto-stx-usd) |
+| ETH/USD | `0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` | [Ver](https://www.pyth.network/price-feeds/crypto-eth-usd) |
+| USDC/USD | `0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` | [Ver](https://www.pyth.network/price-feeds/crypto-usdc-usd) |
+
+## Inicio rápido
+
+
+
+ ### Configurar referencias de contratos
+
+ El oráculo Pyth en Stacks consta de varios contratos. Agregue estas referencias a su contrato:
+
+ ```clarity
+ ;; Pyth oracle contract addresses (mainnet)
+ (define-constant PYTH-ORACLE-CONTRACT 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3)
+ (define-constant PYTH-STORAGE-CONTRACT 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3)
+ (define-constant PYTH-DECODER-CONTRACT 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-pnau-decoder-v2)
+ (define-constant WORMHOLE-CORE-CONTRACT 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.wormhole-core-v3)
+
+ ;; Price feed IDs
+ (define-constant BTC-USD-FEED-ID 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43)
+ ```
+
+
+
+ ### Actualizar y leer datos de precios
+
+ Crear una función que actualice el feed de precios y lea el precio actual:
+
+ ```clarity
+ (define-public (get-btc-price (price-feed-bytes (buff 8192)))
+ (let (
+ ;; Update the price feed with fresh data
+ (update-result (try! (contract-call? PYTH-ORACLE-CONTRACT
+ verify-and-update-price-feeds price-feed-bytes {
+ pyth-storage-contract: PYTH-STORAGE-CONTRACT,
+ pyth-decoder-contract: PYTH-DECODER-CONTRACT,
+ wormhole-core-contract: WORMHOLE-CORE-CONTRACT
+ })))
+
+ ;; Read the updated price
+ (price-data (try! (contract-call? PYTH-ORACLE-CONTRACT
+ get-price
+ BTC-USD-FEED-ID
+ PYTH-STORAGE-CONTRACT)))
+ )
+ (ok price-data)
+ ))
+ ```
+
+ La operación de actualización requiere una pequeña tarifa (típicamente 1 uSTX) para prevenir el spam.
+
+
+
+ ### Procesar datos de precios
+
+ Los datos de precio utilizan representación de punto fijo. Conviértelos a un formato utilizable:
+
+ ```clarity
+ (define-read-only (process-price-data (price-data {
+ price-identifier: (buff 32),
+ price: int,
+ conf: uint,
+ expo: int,
+ ema-price: int,
+ ema-conf: uint,
+ publish-time: uint,
+ prev-publish-time: uint
+ }))
+ (let (
+ ;; Calculate the denominator based on the exponent
+ ;; For expo = -8, denominator = 10^8 = 100,000,000
+ (exponent (get expo price-data))
+ (denominator (pow u10 (to-uint (* exponent -1))))
+
+ ;; Convert to standard decimal representation
+ ;; If price = 10603557773590 and expo = -8
+ ;; Actual price = 10603557773590 / 100,000,000 = 106,035.58
+ (adjusted-price (/ (to-uint (get price price-data)) denominator))
+ )
+ adjusted-price
+ ))
+ ```
+
+
+
+## Patrones comunes
+
+### Acuñación de NFT denominados en USD
+
+Crear un NFT que cueste exactamente $100 en valor de sBTC:
+
+```clarity contracts/benjamin-club.clar
+;; Benjamin Club - $100 NFT minting contract
+(define-constant BENJAMIN-COST u100) ;; $100 USD
+(define-constant ERR-INSUFFICIENT-FUNDS (err u100))
+(define-constant ERR-PRICE-UPDATE-FAILED (err u101))
+
+(define-non-fungible-token benjamin-nft uint)
+(define-data-var last-token-id uint u0)
+
+(define-public (mint-for-hundred-dollars (price-feed-bytes (buff 8192)))
+ (let (
+ ;; Update and get BTC price
+ (price-data (try! (get-btc-price price-feed-bytes)))
+ (btc-price-cents (process-price-data price-data))
+
+ ;; Calculate required sBTC amount
+ ;; $100 = 10,000 cents
+ (required-sbtc (/ (* u10000 u100000000) btc-price-cents))
+
+ ;; Get user's sBTC balance
+ (user-balance (unwrap!
+ (contract-call? .sbtc-token get-balance tx-sender)
+ ERR-INSUFFICIENT-FUNDS))
+ )
+ ;; Verify user has enough sBTC
+ (asserts! (>= user-balance required-sbtc) ERR-INSUFFICIENT-FUNDS)
+
+ ;; Transfer sBTC and mint NFT
+ (try! (contract-call? .sbtc-token transfer
+ required-sbtc tx-sender (as-contract tx-sender) none))
+
+ ;; Mint the NFT
+ (let ((token-id (+ (var-get last-token-id) u1)))
+ (try! (nft-mint? benjamin-nft token-id tx-sender))
+ (var-set last-token-id token-id)
+ (ok token-id))))
+```
+
+### Protección contra la obsolescencia de precios
+
+Asegúrese de que los datos de precios sean lo suficientemente recientes para su caso de uso:
+
+```clarity
+(define-constant MAX-PRICE-AGE u300) ;; 5 minutes in seconds
+
+(define-read-only (is-price-fresh (price-data (tuple)))
+ (let (
+ (current-time (unwrap-panic (get-block-info? time block-height)))
+ (publish-time (get publish-time price-data))
+ )
+ (<= (- current-time publish-time) MAX-PRICE-AGE))
+)
+```
+
+### Agregación de precios de múltiples activos
+
+Obtén múltiples fuentes de precios en una sola transacción:
+
+```clarity
+(define-public (get-multiple-prices
+ (btc-vaa (buff 8192))
+ (eth-vaa (buff 8192))
+ (stx-vaa (buff 8192)))
+ (let (
+ ;; Update all price feeds
+ (updates (try! (contract-call? PYTH-ORACLE-CONTRACT
+ verify-and-update-price-feeds
+ (concat btc-vaa (concat eth-vaa stx-vaa))
+ { pyth-storage-contract: PYTH-STORAGE-CONTRACT,
+ pyth-decoder-contract: PYTH-DECODER-CONTRACT,
+ wormhole-core-contract: WORMHOLE-CORE-CONTRACT })))
+
+ ;; Read all prices
+ (btc-price (try! (get-price-by-id BTC-USD-FEED-ID)))
+ (eth-price (try! (get-price-by-id ETH-USD-FEED-ID)))
+ (stx-price (try! (get-price-by-id STX-USD-FEED-ID)))
+ )
+ (ok { btc: btc-price, eth: eth-price, stx: stx-price }))
+)
+```
+
+## Despliegue en testnet
+
+Para el desarrollo en testnet, utilice estas direcciones de contrato:
+
+```clarity
+;; Testnet addresses
+(define-constant PYTH-ORACLE-CONTRACT-TESTNET 'ST20M5GABDT6WYJHXBT5CDH4501V1Q65242SPRMXH.pyth-oracle-v3)
+(define-constant PYTH-STORAGE-CONTRACT-TESTNET 'ST20M5GABDT6WYJHXBT5CDH4501V1Q65242SPRMXH.pyth-storage-v3)
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Integración frontend](/reference/stacks.js/pyth-oracle-integration): Aprende cómo obtener mensajes VAA y llamar a tus contratos habilitados para oráculos
+* [Pruebas con Clarinet](/tools/clarinet/pyth-oracle-integration): Configurar pruebas para contratos que dependen de datos de oráculos
+:::
diff --git a/content/docs/es/resources/clarity/index.mdx b/content/docs/es/resources/clarity/index.mdx
new file mode 100644
index 000000000..563579f15
--- /dev/null
+++ b/content/docs/es/resources/clarity/index.mdx
@@ -0,0 +1,19 @@
+---
+title: Clarity
+sidebarTitle: Visión general
+description: Explora y domina las funciones incorporadas de Clarity para el desarrollo de contratos inteligentes.
+llm: false
+---
+## Visión general
+
+Cada página en esta sección cubre una o más funciones relacionadas de Clarity, explicando su propósito, demostrando la implementación con ejemplos de código y discutiendo las mejores prácticas. ¿Listo para mejorar tus habilidades de desarrollo de contratos inteligentes en Clarity?
+
+Para explorar Clarity con IA, copie y pegue [llms.txt](/resources/clarity/llms.txt) en tu LLM de elección.
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con Clarity?
+
+Contáctenos en el #clarity canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horario de oficina semanal](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/resources/clarity/meta.json b/content/docs/es/resources/clarity/meta.json
new file mode 100644
index 000000000..a8bc09825
--- /dev/null
+++ b/content/docs/es/resources/clarity/meta.json
@@ -0,0 +1,12 @@
+{
+ "title": "Clarity",
+ "root": true,
+ "pages": [
+ "---Clarity---",
+ "index",
+ "---Reference---",
+ "...reference",
+ "---Integrations---",
+ "...(integrations)"
+ ]
+}
diff --git a/content/docs/es/resources/clarity/reference/functions.mdx b/content/docs/es/resources/clarity/reference/functions.mdx
new file mode 100644
index 000000000..47b609d6f
--- /dev/null
+++ b/content/docs/es/resources/clarity/reference/functions.mdx
@@ -0,0 +1,3329 @@
+---
+title: Referencia de funciones
+sidebarTitle: Funciones
+description: Referencia completa de todas las funciones de Clarity organizadas por categoría, desde operaciones aritméticas hasta gestión de tokens.
+---
+Clarity proporciona un conjunto completo de funciones integradas para el desarrollo de contratos inteligentes. Estas funciones abarcan desde aritmética básica hasta operaciones complejas de tokens e interacciones con la cadena de bloques.
+
+## Operaciones aritméticas \[#arithmetic-operations]
+
+### + (agregar) \[#add]
+
+`+` realiza la suma de un número variable de entradas enteras.
+
+**Firma**
+
+```clarity
+(+ i1 i2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| i1, i2, ... | `int` o `uint` | Dos o más números enteros para sumar |
+
+```clarity
+(+ 1 2 3) ;; Returns 6
+(+ u10 u20) ;; Returns u30
+
+;; Counter example
+(define-data-var counter int 0)
+(define-public (increment (amount int))
+ (begin
+ (var-set counter (+ (var-get counter) amount))
+ (ok (var-get counter))))
+```
+
+### - (restar) \[#subtract]
+
+`-` realiza la resta en un número variable de entradas enteras.
+
+**Firma**
+
+```clarity
+(- i1 i2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| i1, i2, ... | `int` o `uint` | Dos o más números enteros para restar |
+
+```clarity
+(- 10 3) ;; Returns 7
+(- 100 20 10) ;; Returns 70
+(- u50 u30) ;; Returns u20
+
+;; Decrease balance
+(define-public (withdraw (amount uint))
+ (let ((balance (var-get user-balance)))
+ (asserts! (>= balance amount) (err u1))
+ (var-set user-balance (- balance amount))
+ (ok amount)))
+```
+
+### \* (multiplicar) \[#multiply]
+
+`*` realiza la multiplicación de un número variable de entradas enteras.
+
+**Firma**
+
+```clarity
+(* i1 i2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| i1, i2, ... | `int` o `uint` | Dos o más números enteros para multiplicar |
+
+```clarity
+(* 3 4) ;; Returns 12
+(* 2 3 4) ;; Returns 24
+(* u5 u10) ;; Returns u50
+
+;; Calculate percentage
+(define-read-only (calculate-fee (amount uint))
+ (/ (* amount u3) u100)) ;; 3% fee
+```
+
+### / (dividir) \[#divide]
+
+`/` realiza división entera en un número variable de entradas enteras.
+
+**Firma**
+
+```clarity
+(/ i1 i2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| i1, i2, ... | `int` o `uint` | Dos o más números enteros para dividir |
+
+```clarity
+(/ 10 2) ;; Returns 5
+(/ 100 10 2) ;; Returns 5
+(/ u60 u3) ;; Returns u20
+
+;; Calculate average
+(define-read-only (average (a uint) (b uint))
+ (/ (+ a b) u2))
+```
+
+### mod \[#mod]
+
+`mod` devuelve el resto de la división entera.
+
+**Firma**
+
+```clarity
+(mod i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Dividendo |
+| `i2` | `int` o `uint` | Divisor |
+
+```clarity
+(mod 10 3) ;; Returns 1
+(mod u17 u5) ;; Returns u2
+
+;; Check if even
+(define-read-only (is-even (n uint))
+ (is-eq (mod n u2) u0))
+```
+
+### pow \[#pow]
+
+`pow` eleva un número a una potencia.
+
+**Firma**
+
+```clarity
+(pow i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Base |
+| `i2` | `int` o `uint` | Exponente |
+
+```clarity
+(pow 2 3) ;; Returns 8
+(pow u10 u2) ;; Returns u100
+
+;; Calculate compound interest
+(define-read-only (compound-interest (principal uint) (rate uint) (periods uint))
+ (let ((rate-factor (+ u100 rate)))
+ (/ (* principal (pow rate-factor periods)) (pow u100 periods))))
+```
+
+### sqrti \[#sqrti]
+
+`sqrti` devuelve la raíz cuadrada entera de un número.
+
+**Firma**
+
+```clarity
+(sqrti n)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `n` | `int` o `uint` | Número del que se quiere encontrar la raíz cuadrada |
+
+```clarity
+(sqrti u16) ;; Returns u4
+(sqrti u100) ;; Returns u10
+(sqrti 25) ;; Returns 5
+
+;; Calculate distance (simplified)
+(define-read-only (distance (x uint) (y uint))
+ (sqrti (+ (* x x) (* y y))))
+```
+
+### log2 \[#log2]
+
+`log2` devuelve el logaritmo en base 2 de un número.
+
+**Firma**
+
+```clarity
+(log2 n)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `n` | `int` o `uint` | Número del que se quiere encontrar el logaritmo |
+
+```clarity
+(log2 u8) ;; Returns u3
+(log2 u256) ;; Returns u8
+
+;; Calculate bit position
+(define-read-only (highest-bit-position (n uint))
+ (if (> n u0)
+ (some (log2 n))
+ none))
+```
+
+### \< (menor que) \[#less-than]
+
+`<` devuelve true si el primer argumento es menor que el segundo.
+
+**Firma**
+
+```clarity
+(< i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(< 5 10) ;; Returns true
+(< u100 u50) ;; Returns false
+
+;; Validate minimum
+(define-public (deposit (amount uint))
+ (begin
+ (asserts! (< u0 amount) (err u1))
+ (ok amount)))
+```
+
+### > (mayor que) \[#greater-than]
+
+`>` devuelve true si el primer argumento es mayor que el segundo.
+
+**Firma**
+
+```clarity
+(> i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(> 10 5) ;; Returns true
+(> u50 u100) ;; Returns false
+
+;; Check maximum
+(define-read-only (exceeds-limit (value uint))
+ (> value u1000000))
+```
+
+### \<= (menor o igual) \[#less-than-or-equal]
+
+`<=` devuelve true si el primer argumento es menor o igual que el segundo.
+
+**Firma**
+
+```clarity
+(<= i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(<= 5 10) ;; Returns true
+(<= 10 10) ;; Returns true
+(<= u100 u50) ;; Returns false
+
+;; Validate range
+(define-read-only (is-valid-percentage (value uint))
+ (and (<= u0 value) (<= value u100)))
+```
+
+### >= (mayor o igual que) \[#greater-than-or-equal]
+
+`>=` devuelve true si el primer argumento es mayor o igual que el segundo.
+
+**Firma**
+
+```clarity
+(>= i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(>= 10 5) ;; Returns true
+(>= 10 10) ;; Returns true
+(>= u50 u100) ;; Returns false
+
+;; Check balance
+(define-public (can-afford (price uint))
+ (ok (>= (stx-get-balance tx-sender) price)))
+```
+
+## Operaciones lógicas \[#logical-operations]
+
+### y \[#and]
+
+`and` devuelve true si todos los argumentos son true.
+
+**Firma**
+
+```clarity
+(and b1 b2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| b1, b2, ... | `bool` | Valores booleanos a evaluar |
+
+```clarity
+(and true true) ;; Returns true
+(and true false) ;; Returns false
+(and true true true) ;; Returns true
+
+;; Multiple conditions
+(define-read-only (is-valid-transfer (amount uint) (recipient principal))
+ (and
+ (> amount u0)
+ (not (is-eq recipient tx-sender))
+ (<= amount (get-balance tx-sender))))
+```
+
+### o \[#or]
+
+`or` devuelve true si al menos un argumento es verdadero.
+
+**Firma**
+
+```clarity
+(or b1 b2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| b1, b2, ... | `bool` | Valores booleanos a evaluar |
+
+```clarity
+(or true false) ;; Returns true
+(or false false) ;; Returns false
+(or false false true) ;; Returns true
+
+;; Check permissions
+(define-read-only (can-access (user principal))
+ (or
+ (is-eq user contract-owner)
+ (default-to false (map-get? admins user))
+ (var-get public-access)))
+```
+
+### no \[#not]
+
+`not` devuelve la negación lógica de un valor booleano.
+
+**Firma**
+
+```clarity
+(not b)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `b` | `bool` | Valor booleano a negar |
+
+```clarity
+(not true) ;; Returns false
+(not false) ;; Returns true
+
+;; Check if not owner
+(define-read-only (is-not-owner (user principal))
+ (not (is-eq user contract-owner)))
+```
+
+### xor \[#xor]
+
+`xor` devuelve verdadero si exactamente uno de los dos argumentos es verdadero.
+
+**Firma**
+
+```clarity
+(xor b1 b2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `b1` | `bool` | Primer valor booleano |
+| `b2` | `bool` | Segundo valor booleano |
+
+```clarity
+(xor true false) ;; Returns true
+(xor true true) ;; Returns false
+(xor false false) ;; Returns false
+
+;; Exclusive access
+(define-read-only (has-exclusive-role (is-admin bool) (is-moderator bool))
+ (xor is-admin is-moderator))
+```
+
+### is-eq \[#is-eq]
+
+`is-eq` devuelve true si todos los argumentos son iguales.
+
+**Firma**
+
+```clarity
+(is-eq v1 v2...)
+```
+
+**Parámetros**
+
+| Name | Type | Description |
+|------|------|-------------|
+| v1, v2, ... | any | Valores a comparar para igualdad |
+
+```clarity
+(is-eq 5 5) ;; Returns true
+(is-eq "hello" "hello") ;; Returns true
+(is-eq u10 u20) ;; Returns false
+(is-eq 1 1 1) ;; Returns true
+
+;; Check owner
+(define-public (admin-only)
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (ok true)))
+```
+
+## Operaciones de secuencia y cadena \[#sequence-string-operations]
+
+### lista \[#list]
+
+`list` construye una lista a partir de los valores proporcionados.
+
+**Firma**
+
+```clarity
+(list v1 v2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| v1, v2, ... | any | Valores para incluir en la lista |
+
+```clarity
+(list 1 2 3) ;; Returns (1 2 3)
+(list true false true) ;; Returns (true false true)
+
+;; Create address list
+(define-data-var admins (list 5 principal)
+ (list 'SP1234... 'SP5678...))
+```
+
+### append \[#append]
+
+`append` agrega un elemento al final de una lista.
+
+**Firma**
+
+```clarity
+(append list-expr element)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `list-expr` | `list` | Lista a la que añadir |
+| `element` | cualquier | Elemento para agregar |
+
+```clarity
+(append (list 1 2) 3) ;; Returns (1 2 3)
+(append (list) u10) ;; Returns (u10)
+
+;; Add to list
+(define-public (add-member (member principal))
+ (let ((current-list (var-get members)))
+ (match (as-max-len? (append current-list member) u100)
+ new-list (begin
+ (var-set members new-list)
+ (ok true))
+ (err u1))))
+```
+
+### concat \[#concat]
+
+`concat` une dos secuencias del mismo tipo.
+
+**Firma**
+
+```clarity
+(concat sequence1 sequence2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence1` | sequence | Primera secuencia |
+| `sequence2` | secuencia | Segunda secuencia |
+
+```clarity
+(concat "Hello " "World") ;; Returns "Hello World"
+(concat 0x0102 0x0304) ;; Returns 0x01020304
+(concat (list 1 2) (list 3 4)) ;; Returns (1 2 3 4)
+
+;; Combine strings
+(define-read-only (format-message (prefix (string-ascii 10)) (msg (string-ascii 50)))
+ (concat prefix msg))
+```
+
+### len \[#len]
+
+`len` devuelve la longitud de una secuencia.
+
+**Firma**
+
+```clarity
+(len sequence)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | sequence | Secuencia a medir |
+
+```clarity
+(len "Hello") ;; Returns u5
+(len (list 1 2 3)) ;; Returns u3
+(len 0x0102) ;; Returns u2
+
+;; Validate length
+(define-public (set-name (name (string-ascii 50)))
+ (begin
+ (asserts! (> (len name) u0) (err u1))
+ (asserts! (<= (len name) u20) (err u2))
+ (ok name)))
+```
+
+### element-at \[#element-at]
+
+`element-at` recupera un elemento en un índice específico.
+
+**Firma**
+
+```clarity
+(element-at sequence index)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | secuencia | Secuencia para acceder |
+| `index` | `uint` | Índice basado en cero |
+
+```clarity
+(element-at "Hello" u1) ;; Returns (some "e")
+(element-at (list 10 20 30) u2) ;; Returns (some 30)
+(element-at (list 1 2) u5) ;; Returns none
+
+;; Get from list safely
+(define-read-only (get-member-at (index uint))
+ (element-at (var-get members) index))
+```
+
+### índice de \[#index-of]
+
+`index-of` encuentra la primera aparición de un elemento en una secuencia.
+
+**Firma**
+
+```clarity
+(index-of sequence element)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | secuencia | Secuencia a buscar |
+| `element` | cualquier | Elemento a encontrar |
+
+```clarity
+(index-of "Hello" "l") ;; Returns (some u2)
+(index-of (list 1 2 3 2) 2) ;; Returns (some u1)
+(index-of (list 1 2 3) 5) ;; Returns none
+
+;; Check membership
+(define-read-only (is-member (user principal))
+ (is-some (index-of (var-get members) user)))
+```
+
+### rebanada \[#slice]
+
+`slice` extrae una subsecuencia de una secuencia.
+
+**Firma**
+
+```clarity
+(slice sequence left-position right-position)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | secuencia | Secuencia para cortar |
+| `left-position` | `uint` | Índice inicial (inclusive) |
+| `right-position` | `uint` | Índice final (exclusivo) |
+
+```clarity
+(slice "Hello World" u0 u5) ;; Returns (some "Hello")
+(slice (list 1 2 3 4 5) u1 u4) ;; Returns (some (2 3 4))
+
+;; Extract substring
+(define-read-only (get-prefix (text (string-ascii 100)) (length uint))
+ (slice text u0 length))
+```
+
+### reemplazar en \[#replace-at]
+
+`replace-at` reemplaza un elemento en un índice específico.
+
+**Firma**
+
+```clarity
+(replace-at sequence index new-element)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | secuencia | Secuencia a modificar |
+| `index` | `uint` | Índice a reemplazar en |
+| `new-element` | cualquiera | Nuevo elemento |
+
+```clarity
+(replace-at "Hello" u1 "a") ;; Returns (some "Hallo")
+(replace-at (list 1 2 3) u1 5) ;; Returns (some (1 5 3))
+
+;; Update list element
+(define-public (update-member (index uint) (new-member principal))
+ (match (replace-at (var-get members) index new-member)
+ new-list (begin
+ (var-set members new-list)
+ (ok true))
+ (err u404)))
+```
+
+### int-to-ascii \[#int-to-ascii]
+
+`int-to-ascii` convierte un número entero a su representación de cadena ASCII.
+
+**Firma**
+
+```clarity
+(int-to-ascii value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | `int` o `uint` | Entero a convertir |
+
+```clarity
+(int-to-ascii 123) ;; Returns "123"
+(int-to-ascii u456) ;; Returns "456"
+
+;; Format ID
+(define-read-only (format-id (id uint))
+ (concat "ID-" (int-to-ascii id)))
+```
+
+### int-to-utf8 \[#int-to-utf8]
+
+`int-to-utf8` convierte un número entero a su representación de cadena UTF-8.
+
+**Firma**
+
+```clarity
+(int-to-utf8 value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | `int` o `uint` | Entero a convertir |
+
+```clarity
+(int-to-utf8 789) ;; Returns u"789"
+(int-to-utf8 u100) ;; Returns u"100"
+
+;; Create UTF-8 label
+(define-read-only (create-label (num uint))
+ (concat u"Label #" (int-to-utf8 num)))
+```
+
+### string-to-int \[#string-to-int]
+
+`string-to-int` convierte una cadena a un entero opcional.
+
+**Firma**
+
+```clarity
+(string-to-int string)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `string` | `string-ascii` o `string-utf8` | Cadena para convertir |
+
+```clarity
+(string-to-int "123") ;; Returns (some 123)
+(string-to-int "-456") ;; Returns (some -456)
+(string-to-int "abc") ;; Returns none
+
+;; Parse user input
+(define-public (set-value (input (string-ascii 10)))
+ (match (string-to-int input)
+ value (ok (var-set stored-value value))
+ (err u1)))
+```
+
+### string-to-uint \[#string-to-uint]
+
+`string-to-uint` convierte una cadena a un entero sin signo opcional.
+
+**Firma**
+
+```clarity
+(string-to-uint string)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `string` | `string-ascii` o `string-utf8` | Cadena para convertir |
+
+```clarity
+(string-to-uint "123") ;; Returns (some u123)
+(string-to-uint "0") ;; Returns (some u0)
+(string-to-uint "-123") ;; Returns none
+
+;; Parse amount
+(define-read-only (parse-amount (input (string-ascii 20)))
+ (string-to-uint input))
+```
+
+### buff-to-int-be \[#buff-to-int-be]
+
+`buff-to-int-be` convierte un búfer a un entero con signo (big-endian).
+
+**Firma**
+
+```clarity
+(buff-to-int-be buffer)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `buffer` | `buff` | Búfer para convertir |
+
+```clarity
+(buff-to-int-be 0x0001) ;; Returns 1
+(buff-to-int-be 0x00ff) ;; Returns 255
+(buff-to-int-be 0xffff) ;; Returns -1
+
+;; Parse signed data
+(define-read-only (parse-signed-data (data (buff 8)))
+ (buff-to-int-be data))
+```
+
+### buff-to-int-le \[#buff-to-int-le]
+
+`buff-to-int-le` convierte un búfer a un entero con signo (little-endian).
+
+**Firma**
+
+```clarity
+(buff-to-int-le buffer)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `buffer` | `buff` | Búfer para convertir |
+
+```clarity
+(buff-to-int-le 0x0100) ;; Returns 1
+(buff-to-int-le 0xff00) ;; Returns 255
+
+;; Parse little-endian data
+(define-read-only (parse-le-data (data (buff 4)))
+ (buff-to-int-le data))
+```
+
+### buff-to-uint-be \[#buff-to-uint-be]
+
+`buff-to-uint-be` convierte un búfer a un entero sin signo (big-endian).
+
+**Firma**
+
+```clarity
+(buff-to-uint-be buffer)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `buffer` | `buff` | Búfer para convertir |
+
+```clarity
+(buff-to-uint-be 0x0001) ;; Returns u1
+(buff-to-uint-be 0x0100) ;; Returns u256
+
+;; Parse network data
+(define-read-only (parse-network-uint (data (buff 8)))
+ (buff-to-uint-be data))
+```
+
+### buff-to-uint-le \[#buff-to-uint-le]
+
+`buff-to-uint-le` convierte un búfer a un entero sin signo (little-endian).
+
+**Firma**
+
+```clarity
+(buff-to-uint-le buffer)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `buffer` | `buff` | Búfer para convertir |
+
+```clarity
+(buff-to-uint-le 0x0100) ;; Returns u1
+(buff-to-uint-le 0x0001) ;; Returns u256
+
+;; Parse file data
+(define-read-only (parse-file-size (data (buff 4)))
+ (buff-to-uint-le data))
+```
+
+## Iteradores \[#iterators]
+
+### mapa \[#map]
+
+`map` aplica una función a cada elemento de una lista.
+
+**Firma**
+
+```clarity
+(map func list1 list2...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `func` | función | Función a aplicar |
+| lista1, lista2, ... | `list` | Listas para recorrer |
+
+```clarity
+(map + (list 1 2 3) (list 10 20 30)) ;; Returns (11 22 33)
+
+;; Double all values
+(define-private (double (x uint))
+ (* x u2))
+
+(define-read-only (double-all (numbers (list 10 uint)))
+ (map double numbers))
+```
+
+### filtro \[#filter]
+
+`filter` devuelve elementos que satisfacen un predicado.
+
+**Firma**
+
+```clarity
+(filter func list)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `func` | función | Función predicado |
+| `list` | `list` | Lista para filtrar |
+
+```clarity
+(define-private (is-even (x uint))
+ (is-eq (mod x u2) u0))
+
+(filter is-even (list u1 u2 u3 u4)) ;; Returns (u2 u4)
+
+;; Filter active users
+(define-read-only (get-active-users)
+ (filter is-active (var-get all-users)))
+```
+
+### plegar \[#fold]
+
+`fold` reduce una lista a un solo valor.
+
+**Firma**
+
+```clarity
+(fold func list initial-value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `func` | función | Función reductora |
+| `list` | `list` | Lista para reducir |
+| `initial-value` | cualquier | Valor inicial |
+
+```clarity
+(fold + (list u1 u2 u3 u4) u0) ;; Returns u10
+
+;; Sum balances
+(define-private (add-balance (user principal) (total uint))
+ (+ total (default-to u0 (map-get? balances user))))
+
+(define-read-only (get-total-balance)
+ (fold add-balance (var-get users) u0))
+```
+
+## Almacenamiento de datos y variables \[#data-storage-variables]
+
+### define-constant \[#define-constant]
+
+`define-constant` crea un valor constante inmutable.
+
+**Firma**
+
+```clarity
+(define-constant name value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre de la constante |
+| `value` | cualquier | Valor de la constante |
+
+```clarity
+(define-constant contract-owner tx-sender)
+(define-constant token-name "MyToken")
+(define-constant max-supply u1000000)
+
+;; Use in functions
+(define-read-only (get-owner)
+ contract-owner)
+```
+
+### define-data-var \[#define-data-var]
+
+`define-data-var` crea una variable de datos mutable.
+
+**Firma**
+
+```clarity
+(define-data-var name type value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre de la variable |
+| `type` | tipo | Tipo de la variable |
+| `value` | cualquier | Valor inicial |
+
+```clarity
+(define-data-var counter uint u0)
+(define-data-var is-paused bool false)
+(define-data-var admin principal tx-sender)
+
+;; Update variable
+(define-public (increment)
+ (begin
+ (var-set counter (+ (var-get counter) u1))
+ (ok (var-get counter))))
+```
+
+### var-get \[#var-get]
+
+`var-get` recupera el valor de una variable de datos.
+
+**Firma**
+
+```clarity
+(var-get name)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre de la variable |
+
+```clarity
+(define-data-var balance uint u100)
+
+(define-read-only (get-balance)
+ (var-get balance))
+
+;; Use in calculations
+(define-public (double-balance)
+ (let ((current (var-get balance)))
+ (var-set balance (* current u2))
+ (ok (var-get balance))))
+```
+
+### var-set \[#var-set]
+
+`var-set` actualiza el valor de una variable de datos.
+
+**Firma**
+
+```clarity
+(var-set name value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre de la variable |
+| `value` | cualquier | Nuevo valor |
+
+```clarity
+(define-data-var counter uint u0)
+
+(define-public (set-counter (value uint))
+ (begin
+ (var-set counter value)
+ (ok true)))
+
+;; Conditional update
+(define-public (update-if-higher (value uint))
+ (if (> value (var-get counter))
+ (begin
+ (var-set counter value)
+ (ok true))
+ (err u1)))
+```
+
+### define-map \[#define-map]
+
+`define-map` crea un nuevo mapa de datos.
+
+**Firma**
+
+```clarity
+(define-map name key-type value-type)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre del mapa |
+| `key-type` | tipo | Tipo de las llaves |
+| `value-type` | type | Tipo de los valores |
+
+```clarity
+(define-map balances principal uint)
+(define-map user-profiles
+ principal
+ {
+ name: (string-ascii 50),
+ age: uint,
+ active: bool
+ })
+
+;; Composite key
+(define-map allowances
+ { owner: principal, spender: principal }
+ uint)
+```
+
+### map-get? \[#map-get]
+
+`map-get?` recupera un valor de un mapa.
+
+**Firma**
+
+```clarity
+(map-get? map-name key)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `map-name` | símbolo | Nombre del mapa |
+| `key` | cualquier | Clave para buscar |
+
+```clarity
+(define-map balances principal uint)
+
+(define-read-only (get-balance (user principal))
+ (default-to u0 (map-get? balances user)))
+
+;; Pattern matching
+(define-read-only (get-profile-name (user principal))
+ (match (map-get? user-profiles user)
+ profile (get name profile)
+ "Unknown"))
+```
+
+### map-set \[#map-set]
+
+`map-set` establece o actualiza un valor en un mapa.
+
+**Firma**
+
+```clarity
+(map-set map-name key value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `map-name` | símbolo | Nombre del mapa |
+| `key` | cualquier | Tecla para establecer |
+| `value` | cualquier | Valor para almacenar |
+
+```clarity
+(define-map balances principal uint)
+
+(define-public (set-balance (user principal) (amount uint))
+ (begin
+ (map-set balances user amount)
+ (ok true)))
+
+;; Update profile
+(define-public (update-profile (name (string-ascii 50)) (age uint))
+ (begin
+ (map-set user-profiles tx-sender {
+ name: name,
+ age: age,
+ active: true
+ })
+ (ok true)))
+```
+
+### map-insert \[#map-insert]
+
+`map-insert` inserta un valor solo si la clave no existe.
+
+**Firma**
+
+```clarity
+(map-insert map-name key value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `map-name` | símbolo | Nombre del mapa |
+| `key` | cualquier | Tecla para insertar |
+| `value` | cualquier | Valor para almacenar |
+
+```clarity
+(define-map users principal { joined: uint })
+
+(define-public (register)
+ (if (map-insert users tx-sender { joined: block-height })
+ (ok "Registered successfully")
+ (err u409))) ;; Already exists
+
+;; One-time initialization
+(define-public (initialize-user (user principal))
+ (begin
+ (asserts! (map-insert balances user u1000) (err u1))
+ (ok true)))
+```
+
+### map-delete \[#map-delete]
+
+`map-delete` elimina un par clave-valor de un mapa.
+
+**Firma**
+
+```clarity
+(map-delete map-name key)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `map-name` | símbolo | Nombre del mapa |
+| `key` | cualquier | Tecla para eliminar |
+
+```clarity
+(define-map users principal { data: uint })
+
+(define-public (remove-user (user principal))
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (map-delete users user)
+ (ok true)))
+
+;; Clear data
+(define-public (clear-balance)
+ (begin
+ (map-delete balances tx-sender)
+ (ok true)))
+```
+
+### definir-privado \[#define-private]
+
+`define-private` crea una función privada que solo se puede llamar dentro del contrato.
+
+**Firma**
+
+```clarity
+(define-private (function-name (arg-name arg-type)...) body)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `function-name` | símbolo | Nombre de la función |
+| `arg-name` | símbolo | Nombres de argumentos |
+| `arg-type` | tipo | Tipos de argumentos |
+| `body` | expresión | Cuerpo de la función |
+
+```clarity
+(define-private (calculate-fee (amount uint))
+ (/ (* amount u3) u100)) ;; 3% fee
+
+(define-public (transfer-with-fee (recipient principal) (amount uint))
+ (let ((fee (calculate-fee amount)))
+ (try! (stx-transfer? (- amount fee) tx-sender recipient))
+ (try! (stx-transfer? fee tx-sender contract-owner))
+ (ok true)))
+
+;; Helper functions
+(define-private (is-valid-amount (amount uint))
+ (and (> amount u0) (<= amount u1000000)))
+```
+
+### define-public \[#define-public]
+
+`define-public` crea una función pública que se puede llamar desde fuera del contrato.
+
+**Firma**
+
+```clarity
+(define-public (function-name (arg-name arg-type)...) body)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `function-name` | símbolo | Nombre de la función |
+| `arg-name` | símbolo | Nombres de argumentos |
+| `arg-type` | tipo | Tipos de argumentos |
+| `body` | expresión | Cuerpo de la función (debe devolver respuesta) |
+
+```clarity
+(define-public (transfer (recipient principal) (amount uint))
+ (begin
+ (asserts! (not (is-eq tx-sender recipient)) (err u1))
+ (asserts! (> amount u0) (err u2))
+ (try! (ft-transfer? my-token amount tx-sender recipient))
+ (ok true)))
+
+;; State-changing function
+(define-public (set-name (new-name (string-ascii 50)))
+ (begin
+ (map-set user-names tx-sender new-name)
+ (ok new-name)))
+```
+
+### define-read-only \[#define-read-only]
+
+`define-read-only` crea una función pública de solo lectura.
+
+**Firma**
+
+```clarity
+(define-read-only (function-name (arg-name arg-type)...) body)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `function-name` | símbolo | Nombre de la función |
+| `arg-name` | símbolo | Nombres de argumentos |
+| `arg-type` | tipo | Tipos de argumentos |
+| `body` | expresión | Cuerpo de la función |
+
+```clarity
+(define-read-only (get-balance (user principal))
+ (default-to u0 (map-get? balances user)))
+
+(define-read-only (calculate-reward (staked uint) (days uint))
+ (/ (* staked days u5) u36500)) ;; ~5% APY
+
+;; Complex query
+(define-read-only (get-user-info (user principal))
+ {
+ balance: (get-balance user),
+ profile: (map-get? user-profiles user),
+ is-admin: (is-eq user contract-owner)
+ })
+```
+
+## Manejo de errores \[#error-handling]
+
+### ok \[#ok]
+
+`ok` construye un valor de respuesta exitoso.
+
+**Firma**
+
+```clarity
+(ok value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | cualquier | Valor de éxito |
+
+```clarity
+(ok u42) ;; Returns (ok u42)
+(ok { status: "success", value: u100 })
+
+;; Success response
+(define-public (deposit (amount uint))
+ (begin
+ (map-set balances tx-sender
+ (+ (get-balance tx-sender) amount))
+ (ok amount)))
+```
+
+### err \[#err]
+
+`err` construye un valor de respuesta de error.
+
+**Firma**
+
+```clarity
+(err value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | cualquier | Valor de error |
+
+```clarity
+(err u404) ;; Returns (err u404)
+(err { code: u500, message: "Internal error" })
+
+;; Error responses
+(define-public (withdraw (amount uint))
+ (let ((balance (get-balance tx-sender)))
+ (if (>= balance amount)
+ (ok amount)
+ (err u1)))) ;; Insufficient balance
+```
+
+### asserts! \[#asserts]
+
+`asserts!` comprueba una condición y sale con un error si es falsa.
+
+**Firma**
+
+```clarity
+(asserts! condition thrown-value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `condition` | `bool` | Condición a verificar |
+| `thrown-value` | cualquier | Valor a devolver si es falso |
+
+```clarity
+(define-public (transfer (amount uint) (recipient principal))
+ (begin
+ (asserts! (> amount u0) (err u1))
+ (asserts! (not (is-eq tx-sender recipient)) (err u2))
+ (asserts! (<= amount (get-balance tx-sender)) (err u3))
+ (ok true)))
+
+;; Guard functions
+(define-public (admin-only-function)
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ ;; Admin logic here
+ (ok true)))
+```
+
+### ¡inténtalo! \[#try]
+
+`try!` intenta desenvolver una respuesta, propagando cualquier error.
+
+**Firma**
+
+```clarity
+(try! response)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `response` | respuesta | Respuesta para probar |
+
+```clarity
+(try! (ok u42)) ;; Returns u42
+(try! (err u404)) ;; Propagates (err u404)
+
+;; Chain operations
+(define-public (complex-operation (amount uint))
+ (begin
+ (try! (check-preconditions amount))
+ (try! (process-payment amount))
+ (try! (update-records))
+ (ok true)))
+```
+
+### ¡desenvolver! \[#unwrap]
+
+`unwrap!` extrae el valor interno de una respuesta opcional o correcta.
+
+**Firma**
+
+```clarity
+(unwrap! optional-or-response thrown-value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `optional-or-response` | opcional/respuesta | Valor a desenvolver |
+| `thrown-value` | cualquiera | Valor si ninguno/error |
+
+```clarity
+(unwrap! (some u42) (err u1)) ;; Returns u42
+(unwrap! none (err u404)) ;; Throws (err u404)
+
+;; Safe access
+(define-public (transfer-from-map (recipient principal))
+ (let ((amount (unwrap! (map-get? pending-transfers tx-sender) (err u404))))
+ (try! (ft-transfer? token amount tx-sender recipient))
+ (map-delete pending-transfers tx-sender)
+ (ok amount)))
+```
+
+### unwrap-err! \[#unwrap-err]
+
+`unwrap-err!` extrae el valor de error de una respuesta de error.
+
+**Firma**
+
+```clarity
+(unwrap-err! response thrown-value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `response` | respuesta | Respuesta a desenvolver |
+| `thrown-value` | cualquier | Valor si está bien |
+
+```clarity
+(unwrap-err! (err u404) u0) ;; Returns u404
+(unwrap-err! (ok u42) u0) ;; Returns u0
+
+;; Error handling
+(define-public (handle-error)
+ (let ((error-code (unwrap-err! (process-action) u0)))
+ (print { error: error-code })
+ (ok error-code)))
+```
+
+### unwrap-panic \[#unwrap-panic]
+
+`unwrap-panic` extrae un valor o provoca un pánico en tiempo de ejecución.
+
+**Firma**
+
+```clarity
+(unwrap-panic optional-or-response)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `optional-or-response` | opcional/respuesta | Valor a desenvolver |
+
+```clarity
+(unwrap-panic (some u42)) ;; Returns u42
+(unwrap-panic none) ;; Runtime panic
+
+;; Critical unwrap
+(define-read-only (get-critical-value)
+ (unwrap-panic (map-get? critical-config "version")))
+```
+
+### unwrap-err-panic \[#unwrap-err-panic]
+
+`unwrap-err-panic` extrae un valor de error o causa un pánico en tiempo de ejecución.
+
+**Firma**
+
+```clarity
+(unwrap-err-panic response)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `response` | respuesta | Respuesta a desenvolver |
+
+```clarity
+(unwrap-err-panic (err u404)) ;; Returns u404
+(unwrap-err-panic (ok u42)) ;; Runtime panic
+
+;; Force error
+(define-read-only (get-error-code)
+ (unwrap-err-panic (always-fails)))
+```
+
+## Ayudantes de datos \[#data-helpers]
+
+### default-to \[#default-to]
+
+`default-to` devuelve un valor predeterminado para ninguno.
+
+**Firma**
+
+```clarity
+(default-to default optional)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `default` | cualquiera | Valor predeterminado |
+| `optional` | opcional | Valor opcional |
+
+```clarity
+(default-to u0 (some u42)) ;; Returns u42
+(default-to u0 none) ;; Returns u0
+
+;; Safe defaults
+(define-read-only (get-balance-safe (user principal))
+ (default-to u0 (map-get? balances user)))
+```
+
+### fusionar \[#merge]
+
+`merge` combina dos tuplas, con la segunda anulando la primera.
+
+**Firma**
+
+```clarity
+(merge tuple1 tuple2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `tuple1` | tupla | Tupla base |
+| `tuple2` | tupla | Anular tupla |
+
+```clarity
+(merge { a: u1, b: u2 } { b: u3, c: u4 })
+;; Returns { a: u1, b: u3, c: u4 }
+
+;; Update record
+(define-public (update-profile (updates { name: (optional (string-ascii 50)), age: (optional uint) }))
+ (let ((current (default-to { name: "", age: u0 } (map-get? profiles tx-sender))))
+ (map-set profiles tx-sender (merge current updates))
+ (ok true)))
+```
+
+### obtener \[#get]
+
+`get` extrae un valor de una tupla por clave.
+
+**Firma**
+
+```clarity
+(get key tuple)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `key` | símbolo | Clave para extraer |
+| `tuple` | tupla | Tupla a la que acceder |
+
+```clarity
+(get balance { balance: u100, locked: u50 }) ;; Returns u100
+
+;; Access nested data
+(define-read-only (get-user-balance (user principal))
+ (match (map-get? accounts user)
+ account (get balance account)
+ u0))
+```
+
+### as-max-len? \[#as-max-len]
+
+`as-max-len?` comprueba si una secuencia cabe dentro de una longitud máxima.
+
+**Firma**
+
+```clarity
+(as-max-len? sequence max-length)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `sequence` | secuencia | Secuencia a verificar |
+| `max-length` | uint | Longitud máxima permitida |
+
+```clarity
+(as-max-len? (list 1 2 3) u5) ;; Returns (some (1 2 3))
+(as-max-len? "Hello" u3) ;; Returns none
+
+;; Safe append
+(define-public (add-to-list (item uint))
+ (match (as-max-len? (append (var-get items) item) u100)
+ new-list (begin
+ (var-set items new-list)
+ (ok true))
+ (err u1)))
+```
+
+## Control de flujo \[#control-flow]
+
+### si \[#if]
+
+`if` evalúa una condición y devuelve uno de dos valores.
+
+**Firma**
+
+```clarity
+(if condition true-branch false-branch)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `condition` | `bool` | Condición a evaluar |
+| `true-branch` | cualquier | Valor si es verdadero |
+| `false-branch` | cualquier | Valor si es falso |
+
+```clarity
+(if (> u10 u5)
+ "Greater"
+ "Not greater") ;; Returns "Greater"
+
+;; Conditional logic
+(define-public (withdraw (amount uint))
+ (let ((balance (get-balance tx-sender)))
+ (if (>= balance amount)
+ (begin
+ (map-set balances tx-sender (- balance amount))
+ (ok amount))
+ (err u1))))
+```
+
+### partido \[#match]
+
+`match` realiza la coincidencia de patrones en tipos opcionales y de respuesta.
+
+**Firma**
+
+```clarity
+(match value
+ some-name some-branch
+ none-branch)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | opcional/respuesta | Valor a coincidir |
+| `some-name` | símbolo | Enlace para algún valor |
+| `some-branch` | expresión | Expresión si alguna |
+| `none-branch` | expresión | Expresión si no hay ninguna |
+
+```clarity
+(match (map-get? balances tx-sender)
+ balance (ok balance)
+ (err u404))
+
+;; Response matching
+(match (ft-transfer? token u100 tx-sender recipient)
+ success (ok "Transfer successful")
+ error (err error))
+
+;; Nested matching
+(define-read-only (get-user-name (user principal))
+ (match (map-get? user-profiles user)
+ profile (match (get name profile)
+ name (ok name)
+ (err u1))
+ (err u404)))
+```
+
+### begin \[#begin]
+
+`begin` ejecuta múltiples expresiones en secuencia.
+
+**Firma**
+
+```clarity
+(begin expr1 expr2... last-expr)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| expr1, expr2, ... | any | Expresiones a ejecutar |
+| `last-expr` | cualquier | Expresión final (valor de retorno) |
+
+```clarity
+(begin
+ (print "Starting")
+ (var-set counter u1)
+ (ok true))
+
+;; Multiple operations
+(define-public (initialize)
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (var-set is-initialized true)
+ (map-set admins tx-sender true)
+ (print { event: "initialized", by: tx-sender })
+ (ok true)))
+```
+
+### dejemos \[#let]
+
+`let` crea enlaces locales para su uso en una expresión.
+
+**Firma**
+
+```clarity
+(let ((name1 value1) (name2 value2)...) body)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `name` | símbolo | Nombre de enlace |
+| `value` | cualquier | Valor para vincular |
+| `body` | expresión | Expresión usando enlaces |
+
+```clarity
+(let ((x 10) (y 20))
+ (+ x y)) ;; Returns 30
+
+;; Complex calculations
+(define-public (calculate-reward (days uint))
+ (let (
+ (balance (get-balance tx-sender))
+ (rate u5) ;; 5% annual
+ (reward (/ (* balance rate days) u36500)))
+ (begin
+ (map-set rewards tx-sender reward)
+ (ok reward))))
+```
+
+## Tipos opcionales y de respuesta \[#optional-response-types]
+
+### algunos \[#some]
+
+`some` construye un valor opcional que contiene un valor.
+
+**Firma**
+
+```clarity
+(some value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | cualquier | Valor para envolver |
+
+```clarity
+(some u42) ;; Returns (some u42)
+(some "Hello") ;; Returns (some "Hello")
+
+;; Return optional
+(define-read-only (find-user (id uint))
+ (if (map-get? users id)
+ (some (map-get? users id))
+ none))
+```
+
+### está-bien \[#is-ok]
+
+`is-ok` comprueba si una respuesta es correcta.
+
+**Firma**
+
+```clarity
+(is-ok response)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `response` | respuesta | Respuesta a verificar |
+
+```clarity
+(is-ok (ok u42)) ;; Returns true
+(is-ok (err u1)) ;; Returns false
+
+;; Check success
+(define-read-only (was-successful (tx-id uint))
+ (is-ok (map-get? transaction-results tx-id)))
+```
+
+### is-err \[#is-err]
+
+`is-err` comprueba si una respuesta es err.
+
+**Firma**
+
+```clarity
+(is-err response)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `response` | respuesta | Respuesta a verificar |
+
+```clarity
+(is-err (err u404)) ;; Returns true
+(is-err (ok u42)) ;; Returns false
+
+;; Check failure
+(define-read-only (has-error (result (response uint uint)))
+ (is-err result))
+```
+
+### es-alguno \[#is-some]
+
+`is-some` comprueba si un opcional contiene un valor.
+
+**Firma**
+
+```clarity
+(is-some optional)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `optional` | opcional | Opcional para marcar |
+
+```clarity
+(is-some (some u42)) ;; Returns true
+(is-some none) ;; Returns false
+
+;; Check existence
+(define-read-only (user-exists (user principal))
+ (is-some (map-get? users user)))
+```
+
+### es-ninguno \[#is-none]
+
+`is-none` comprueba si un opcional es ninguno.
+
+**Firma**
+
+```clarity
+(is-none optional)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `optional` | opcional | Opcional para marcar |
+
+```clarity
+(is-none none) ;; Returns true
+(is-none (some u42)) ;; Returns false
+
+;; Check absence
+(define-read-only (is-available (name (string-ascii 50)))
+ (is-none (map-get? reserved-names name)))
+```
+
+## Tokens fungibles \[#fungible-tokens]
+
+### define-fungible-token \[#define-fungible-token]
+
+`define-fungible-token` crea un nuevo token fungible.
+
+**Firma**
+
+```clarity
+(define-fungible-token token-name [total-supply])
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token-name` | símbolo | Nombre del token |
+| `total-supply` | `uint` (opcional) | Suministro máximo |
+
+```clarity
+(define-fungible-token my-token)
+(define-fungible-token limited-token u1000000)
+
+;; With helper functions
+(define-public (get-balance (user principal))
+ (ok (ft-get-balance my-token user)))
+```
+
+### ft-mint? \[#ft-mint]
+
+`ft-mint?` crea nuevos tokens para un destinatario.
+
+**Firma**
+
+```clarity
+(ft-mint? token amount recipient)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | Token a acuñar |
+| `amount` | `uint` | Cantidad para acuñar |
+| `recipient` | `principal` | Destinatario de tokens |
+
+```clarity
+(ft-mint? my-token u100 tx-sender)
+
+;; Mint with checks
+(define-public (mint-tokens (amount uint) (recipient principal))
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (ft-mint? my-token amount recipient)))
+```
+
+### ft-burn? \[#ft-burn]
+
+`ft-burn?` destruye tokens de un propietario.
+
+**Firma**
+
+```clarity
+(ft-burn? token amount owner)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | Token a quemar |
+| `amount` | `uint` | Cantidad para quemar |
+| `owner` | `principal` | Propietario de tokens |
+
+```clarity
+(ft-burn? my-token u50 tx-sender)
+
+;; Burn own tokens
+(define-public (burn (amount uint))
+ (ft-burn? my-token amount tx-sender))
+```
+
+### ft-transfer? \[#ft-transfer]
+
+`ft-transfer?` transfiere tokens entre principales.
+
+**Firma**
+
+```clarity
+(ft-transfer? token amount sender recipient)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | Token a transferir |
+| `amount` | `uint` | Cantidad a transferir |
+| `sender` | `principal` | Remitente |
+| `recipient` | `principal` | Destinatario |
+
+```clarity
+(ft-transfer? my-token u50 tx-sender recipient)
+
+;; Transfer with memo
+(define-public (transfer-memo (amount uint) (recipient principal) (memo (buff 32)))
+ (begin
+ (print { action: "transfer", amount: amount, memo: memo })
+ (ft-transfer? my-token amount tx-sender recipient)))
+```
+
+### ft-get-balance \[#ft-get-balance]
+
+`ft-get-balance` devuelve el saldo de tokens de un principal.
+
+**Firma**
+
+```clarity
+(ft-get-balance token principal)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | Token para consultar |
+| `principal` | `principal` | Cuenta a verificar |
+
+```clarity
+(ft-get-balance my-token tx-sender) ;; Returns uint
+
+;; Balance check
+(define-read-only (has-sufficient-balance (user principal) (required uint))
+ (>= (ft-get-balance my-token user) required))
+```
+
+### ft-get-supply \[#ft-get-supply]
+
+`ft-get-supply` devuelve el suministro actual de tokens.
+
+**Firma**
+
+```clarity
+(ft-get-supply token)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | Token para consultar |
+
+```clarity
+(ft-get-supply my-token) ;; Returns uint
+
+;; Supply metrics
+(define-read-only (get-supply-info)
+ {
+ current: (ft-get-supply my-token),
+ max: u1000000,
+ remaining: (- u1000000 (ft-get-supply my-token))
+ })
+```
+
+## Tokens no fungibles \[#non-fungible-tokens]
+
+### define-non-fungible-token \[#define-non-fungible-token]
+
+`define-non-fungible-token` crea un nuevo token no fungible.
+
+**Firma**
+
+```clarity
+(define-non-fungible-token token-name identifier-type)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token-name` | símbolo | Nombre del NFT |
+| `identifier-type` | type | Tipo del identificador |
+
+```clarity
+(define-non-fungible-token my-nft uint)
+(define-non-fungible-token complex-nft { id: uint, serial: (buff 20) })
+
+;; NFT with metadata
+(define-map nft-metadata uint {
+ name: (string-ascii 50),
+ uri: (string-ascii 200)
+})
+```
+
+### ¿Acuñación de NFT? \[#nft-mint]
+
+`nft-mint?` crea un nuevo NFT para un destinatario.
+
+**Firma**
+
+```clarity
+(nft-mint? token identifier recipient)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | NFT para acuñar |
+| `identifier` | cualquier | Identificador único |
+| `recipient` | `principal` | Destinatario |
+
+```clarity
+(nft-mint? my-nft u1 tx-sender)
+
+;; Mint with metadata
+(define-public (mint-with-metadata (id uint) (name (string-ascii 50)) (uri (string-ascii 200)))
+ (begin
+ (try! (nft-mint? my-nft id tx-sender))
+ (map-set nft-metadata id { name: name, uri: uri })
+ (ok id)))
+```
+
+### ¿Quemar NFT? \[#nft-burn]
+
+`nft-burn?` destruye un NFT.
+
+**Firma**
+
+```clarity
+(nft-burn? token identifier owner)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | NFT para quemar |
+| `identifier` | cualquier | identificador NFT |
+| `owner` | `principal` | Propietario actual |
+
+```clarity
+(nft-burn? my-nft u1 tx-sender)
+
+;; Burn with ownership check
+(define-public (burn-nft (id uint))
+ (let ((owner (unwrap! (nft-get-owner? my-nft id) (err u404))))
+ (asserts! (is-eq owner tx-sender) (err u403))
+ (nft-burn? my-nft id tx-sender)))
+```
+
+### nft-transfer? \[#nft-transfer]
+
+`nft-transfer?` transfiere un NFT entre principales.
+
+**Firma**
+
+```clarity
+(nft-transfer? token identifier sender recipient)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | NFT a transferir |
+| `identifier` | cualquier | identificador NFT |
+| `sender` | `principal` | Propietario actual |
+| `recipient` | `principal` | Nuevo propietario |
+
+```clarity
+(nft-transfer? my-nft u1 tx-sender recipient)
+
+;; Safe transfer
+(define-public (transfer (id uint) (recipient principal))
+ (let ((owner (unwrap! (nft-get-owner? my-nft id) (err u404))))
+ (asserts! (is-eq owner tx-sender) (err u403))
+ (nft-transfer? my-nft id tx-sender recipient)))
+```
+
+### nft-get-owner? \[#nft-get-owner]
+
+`nft-get-owner?` devuelve el propietario de un NFT.
+
+**Firma**
+
+```clarity
+(nft-get-owner? token identifier)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `token` | token-name | NFT a consultar |
+| `identifier` | cualquier | identificador NFT |
+
+```clarity
+(nft-get-owner? my-nft u1) ;; Returns (optional principal)
+
+;; Ownership check
+(define-read-only (is-owner (id uint) (user principal))
+ (match (nft-get-owner? my-nft id)
+ owner (is-eq owner user)
+ false))
+```
+
+## Operaciones STX \[#stx-operations]
+
+### stx-transfer? \[#stx-transfer]
+
+`stx-transfer?` transfiere STX entre direcciones.
+
+**Firma**
+
+```clarity
+(stx-transfer? amount sender recipient)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `amount` | `uint` | Cantidad en microSTX |
+| `sender` | `principal` | Dirección del remitente |
+| `recipient` | `principal` | Dirección del destinatario |
+
+```clarity
+(stx-transfer? u1000000 tx-sender recipient) ;; Transfer 1 STX
+
+;; Payment function
+(define-public (pay (amount uint) (recipient principal))
+ (begin
+ (asserts! (> amount u0) (err u1))
+ (stx-transfer? amount tx-sender recipient)))
+```
+
+### stx-transfer-memo? \[#stx-transfer-memo]
+
+`stx-transfer-memo?` transfiere STX con un memo.
+
+**Firma**
+
+```clarity
+(stx-transfer-memo? amount sender recipient memo)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `amount` | `uint` | Cantidad en microSTX |
+| `sender` | `principal` | Dirección del remitente |
+| `recipient` | `principal` | Dirección del destinatario |
+| `memo` | `(buff 34)` | Memo de transferencia |
+
+```clarity
+(stx-transfer-memo? u1000000 tx-sender recipient 0x12345678)
+
+;; Payment with reference
+(define-public (pay-invoice (amount uint) (recipient principal) (invoice-id (buff 16)))
+ (stx-transfer-memo? amount tx-sender recipient
+ (concat 0x494e56 invoice-id))) ;; "INV" prefix
+```
+
+### ¿Quema de STX? \[#stx-burn]
+
+`stx-burn?` quema STX enviándolo a una dirección de quemado.
+
+**Firma**
+
+```clarity
+(stx-burn? amount sender)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `amount` | `uint` | Cantidad para quemar |
+| `sender` | `principal` | Quemando dirección STX |
+
+```clarity
+(stx-burn? u1000000 tx-sender)
+
+;; Burn mechanism
+(define-public (burn-stx (amount uint))
+ (begin
+ (asserts! (> amount u0) (err u1))
+ (stx-burn? amount tx-sender)))
+```
+
+### stx-get-balance \[#stx-get-balance]
+
+`stx-get-balance` devuelve el saldo de STX de una dirección.
+
+**Firma**
+
+```clarity
+(stx-get-balance principal)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `principal` | `principal` | Dirección a verificar |
+
+```clarity
+(stx-get-balance tx-sender) ;; Returns uint
+
+;; Balance check
+(define-read-only (can-afford-fee (user principal) (fee uint))
+ (>= (stx-get-balance user) fee))
+```
+
+### stx-account \[#stx-account]
+
+`stx-account` devuelve información detallada de la cuenta.
+
+**Firma**
+
+```clarity
+(stx-account principal)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `principal` | `principal` | Dirección a consultar |
+
+```clarity
+(stx-account tx-sender)
+;; Returns { locked: uint, unlock-height: uint, unlocked: uint }
+
+;; Get available balance
+(define-read-only (get-available-balance (user principal))
+ (get unlocked (stx-account user)))
+```
+
+## Funciones criptográficas \[#cryptographic-functions]
+
+### sha256 \[#sha256]
+
+`sha256` calcula el hash SHA-256 de los datos de entrada.
+
+**Firma**
+
+```clarity
+(sha256 data)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `data` | secuencia | Datos para hacer hash |
+
+```clarity
+(sha256 0x616263) ;; Returns SHA-256 of "abc"
+(sha256 "Hello") ;; Hash string
+
+;; Create hash commitment
+(define-public (commit-hash (data (buff 32)))
+ (let ((hash (sha256 data)))
+ (map-set commitments tx-sender hash)
+ (ok hash)))
+```
+
+### sha512 \[#sha512]
+
+`sha512` calcula el hash SHA-512 de los datos de entrada.
+
+**Firma**
+
+```clarity
+(sha512 data)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `data` | secuencia | Datos para hacer hash |
+
+```clarity
+(sha512 0x616263) ;; Returns SHA-512 hash
+(sha512 "data") ;; Hash string
+
+;; High security hash
+(define-read-only (secure-hash (input (buff 1024)))
+ (sha512 input))
+```
+
+### sha512/256 \[#sha512-256]
+
+`sha512/256` calcula el hash SHA-512/256 de los datos de entrada.
+
+**Firma**
+
+```clarity
+(sha512/256 data)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `data` | secuencia | Datos para hacer hash |
+
+```clarity
+(sha512/256 0x616263) ;; Returns 256-bit hash
+(sha512/256 "secure") ;; Hash string
+
+;; Merkle tree node
+(define-private (hash-pair (left (buff 32)) (right (buff 32)))
+ (sha512/256 (concat left right)))
+```
+
+### keccak256 \[#keccak256]
+
+`keccak256` calcula el hash Keccak-256 de los datos de entrada.
+
+**Firma**
+
+```clarity
+(keccak256 data)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `data` | secuencia | Datos para hacer hash |
+
+```clarity
+(keccak256 0x616263) ;; Returns Keccak-256 hash
+(keccak256 "ethereum") ;; Hash string
+
+;; Ethereum compatibility
+(define-read-only (eth-compatible-hash (data (buff 256)))
+ (keccak256 data))
+```
+
+### hash160 \[#hash160]
+
+`hash160` calcula RIPEMD160(SHA256(datos)).
+
+**Firma**
+
+```clarity
+(hash160 data)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `data` | secuencia | Datos para hacer hash |
+
+```clarity
+(hash160 0x616263) ;; Returns 160-bit hash
+(hash160 "address") ;; Hash string
+
+;; Bitcoin-style address
+(define-read-only (create-hash160-id (data (buff 32)))
+ (hash160 data))
+```
+
+### secp256k1-verify \[#secp256k1-verify]
+
+`secp256k1-verify` verifica una firma contra un hash de mensaje.
+
+**Firma**
+
+```clarity
+(secp256k1-verify hash signature public-key)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `hash` | `(buff 32)` | Hash del mensaje |
+| `signature` | `(buff 65)` | Firma |
+| `public-key` | `(buff 33)` | Clave pública |
+
+```clarity
+(secp256k1-verify
+ 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
+ signature
+ public-key) ;; Returns bool
+
+;; Signature verification
+(define-public (verify-signature (hash (buff 32)) (sig (buff 65)) (pubkey (buff 33)))
+ (ok (secp256k1-verify hash sig pubkey)))
+```
+
+### secp256k1-recover? \[#secp256k1-recover]
+
+`secp256k1-recover?` recupera una clave pública a partir de una firma.
+
+**Firma**
+
+```clarity
+(secp256k1-recover? hash signature)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `hash` | `(buff 32)` | Hash del mensaje |
+| `signature` | `(buff 65)` | Firma |
+
+```clarity
+(secp256k1-recover? message-hash signature)
+;; Returns (optional (buff 33))
+
+;; Recover signer
+(define-read-only (recover-signer (hash (buff 32)) (sig (buff 65)))
+ (secp256k1-recover? hash sig))
+```
+
+## Datos de blockchain \[#blockchain-data]
+
+### ¿obtener-información-del-bloque? \[#get-block-info]
+
+`get-block-info?` recupera información sobre un bloque.
+
+**Firma**
+
+```clarity
+(get-block-info? property block)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `property` | PropertyName | Propiedad a recuperar |
+| `block` | `uint` | Altura del bloque |
+
+Propiedades: `header-hash`, `burnchain-header-hash`, `time`, `miner-address`, `block-reward`, `miner-spend-total`, `miner-spend-winner`
+
+```clarity
+(get-block-info? time u100) ;; Returns (optional uint)
+(get-block-info? miner-address u200) ;; Returns (optional principal)
+
+;; Get block time
+(define-read-only (get-block-timestamp (height uint))
+ (get-block-info? time height))
+```
+
+### get-burn-block-info? \[#get-burn-block-info]
+
+`get-burn-block-info?` recupera información de bloques de Bitcoin.
+
+**Firma**
+
+```clarity
+(get-burn-block-info? property block)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `property` | PropertyName | Propiedad a recuperar |
+| `block` | `uint` | Altura del bloque de quemado |
+
+Propiedades: `header-hash`, `pox-addrs`
+
+```clarity
+(get-burn-block-info? header-hash u100) ;; Returns (optional (buff 32))
+
+;; Get burn block hash
+(define-read-only (get-btc-header-hash (height uint))
+ (get-burn-block-info? header-hash height))
+```
+
+### ¿obtener información del bloque de Stacks? \[#get-stacks-block-info]
+
+`get-stacks-block-info?` recupera información del bloque de Stacks.
+
+**Firma**
+
+```clarity
+(get-stacks-block-info? property block)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `property` | PropertyName | Propiedad a recuperar |
+| `block` | `uint` | Altura del bloque de Stacks |
+
+Propiedades: `header-hash`, `block-hash`, `miner-address`, `block-reward`
+
+```clarity
+(get-stacks-block-info? block-hash u100) ;; Returns (optional (buff 32))
+
+;; Get stacks block data
+(define-read-only (get-stacks-block-hash (height uint))
+ (get-stacks-block-info? block-hash height))
+```
+
+### ¿obtener información sobre la titularidad? \[#get-tenure-info]
+
+`get-tenure-info?` recupera información sobre la tenencia.
+
+**Firma**
+
+```clarity
+(get-tenure-info? property block)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `property` | PropertyName | Propiedad a recuperar |
+| `block` | `uint` | Bloque de tenencia |
+
+Propiedades: `burnchain-header-hash`, `miner-address`, `time`, `vrf-seed`
+
+```clarity
+(get-tenure-info? vrf-seed u100) ;; Returns (optional (buff 32))
+
+;; Get tenure VRF seed
+(define-read-only (get-vrf-seed (tenure uint))
+ (get-tenure-info? vrf-seed tenure))
+```
+
+### at-block \[#at-block]
+
+`at-block` evalúa una expresión en un contexto de bloque específico.
+
+**Firma**
+
+```clarity
+(at-block block-hash expr)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `block-hash` | `(buff 32)` | Hash del bloque |
+| `expr` | expresión | Expresión a evaluar |
+
+```clarity
+(at-block 0x1234... (var-get counter)) ;; Get historical value
+
+;; Historical balance
+(define-read-only (get-balance-at-block (user principal) (block-hash (buff 32)))
+ (at-block block-hash (ft-get-balance my-token user)))
+```
+
+## Operaciones principales y contractuales \[#principal-contract-operations]
+
+### principal-construct? \[#principal-construct]
+
+`principal-construct?` crea un principal a partir de componentes de dirección.
+
+**Firma**
+
+```clarity
+(principal-construct? version-byte hash)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `version-byte` | `(buff 1)` | Byte de versión |
+| `hash` | `(buff 20)` | Hash de dirección |
+
+```clarity
+(principal-construct? 0x16 0x1234567890abcdef1234567890abcdef12345678)
+;; Returns (optional principal)
+
+;; Construct address
+(define-read-only (make-principal (version (buff 1)) (hash (buff 20)))
+ (principal-construct? version hash))
+```
+
+### principal-destruct? \[#principal-destruct]
+
+`principal-destruct?` descompone un principal en componentes.
+
+**Firma**
+
+```clarity
+(principal-destruct? principal)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `principal` | `principal` | Principio a descomponer |
+
+```clarity
+(principal-destruct? tx-sender)
+;; Returns (optional { version: (buff 1), hash: (buff 20) })
+
+;; Get address components
+(define-read-only (get-principal-parts (user principal))
+ (principal-destruct? user))
+```
+
+### principal-de? \[#principal-of]
+
+`principal-of?` devuelve el principal de una clave pública.
+
+**Firma**
+
+```clarity
+(principal-of? public-key)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `public-key` | `(buff 33)` | Clave pública |
+
+```clarity
+(principal-of? 0x0234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12)
+;; Returns (optional principal)
+
+;; Derive address
+(define-read-only (pubkey-to-principal (pubkey (buff 33)))
+ (principal-of? pubkey))
+```
+
+### contract-call? \[#contract-call]
+
+`contract-call?` llama a una función pública en otro contrato.
+
+**Firma**
+
+```clarity
+(contract-call? contract function-name args...)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `contract` | principal | Contrato a llamar |
+| `function-name` | símbolo | Nombre de la función |
+| `args` | cualquier | Argumentos de función |
+
+```clarity
+(contract-call? .other-contract transfer u100 tx-sender recipient)
+
+;; Cross-contract call
+(define-public (forward-call (amount uint))
+ (contract-call? .token-contract transfer amount tx-sender contract-owner))
+```
+
+### as-contract \[#as-contract]
+
+`as-contract` ejecuta una expresión con el contrato como tx-sender.
+
+**Firma**
+
+```clarity
+(as-contract expr)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `expr` | expresión | Expresión a ejecutar |
+
+```clarity
+(as-contract (stx-transfer? u1000 tx-sender recipient))
+
+;; Contract-owned transfers
+(define-public (withdraw-fees (recipient principal))
+ (let ((balance (stx-get-balance (as-contract tx-sender))))
+ (as-contract (stx-transfer? balance tx-sender recipient))))
+```
+
+### contrato de \[#contract-of]
+
+`contract-of` devuelve el principal de una referencia de rasgo.
+
+**Firma**
+
+```clarity
+(contract-of trait-ref)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `trait-ref` | rasgo | Referencia de rasgo |
+
+```clarity
+(contract-of token-trait) ;; Returns principal
+
+;; Get implementation
+(define-read-only (get-token-contract)
+ (contract-of deployed-token))
+```
+
+### es-estándar \[#is-standard]
+
+`is-standard` comprueba si un principal coincide con el tipo de red actual y puede gastar tokens.
+
+**Firma**
+
+```clarity
+(is-standard standard-or-contract-principal)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `standard-or-contract-principal` | `principal` | Principio a verificar |
+
+```clarity
+;; On testnet
+(is-standard 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6) ;; Returns true
+(is-standard 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.foo) ;; Returns true
+(is-standard 'SP3X6QWWETNBZWGBK6DRGTR1KX50S74D3433WDGJY) ;; Returns false
+
+;; On mainnet
+(is-standard 'SP3X6QWWETNBZWGBK6DRGTR1KX50S74D3433WDGJY) ;; Returns true
+(is-standard 'SP3X6QWWETNBZWGBK6DRGTR1KX50S74D3433WDGJY.foo) ;; Returns true
+(is-standard 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6) ;; Returns false
+```
+
+Puntos clave:
+
+* Comprueba si un principal puede gastar tokens en la red actual
+* Mainnet: Solo `SP` y `SM` las direcciones pueden gastar
+* Testnet: Solo `ST` y `SN` las direcciones pueden gastar
+* Todas las direcciones pueden recibir tokens, pero solo los tipos de red coincidentes pueden gastarlos
+* Disponible a partir de Stacks 2.1
+
+```clarity
+;; Network-aware validation
+(define-read-only (can-spend-on-network (address principal))
+ (is-standard address))
+
+;; Check if address matches network before allowing spending
+(define-public (network-aware-transfer (recipient principal) (amount uint))
+ (begin
+ (asserts! (is-standard tx-sender) (err u401))
+ (asserts! (is-standard recipient) (err u402))
+ ;; Transfer logic
+ (ok true)))
+```
+
+## Rasgos \[#traits]
+
+### definir-rasgo \[#define-trait]
+
+`define-trait` crea una nueva definición de rasgo.
+
+**Firma**
+
+```clarity
+(define-trait trait-name ((function-name (args...) response-type)...))
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `trait-name` | símbolo | Nombre del rasgo |
+| `function-name` | símbolo | Firmas de función |
+
+```clarity
+(define-trait fungible-token (
+ (transfer (uint principal principal) (response bool uint))
+ (get-balance (principal) (response uint uint))
+))
+
+;; NFT trait
+(define-trait nft-trait (
+ (transfer (uint principal principal) (response bool uint))
+ (get-owner (uint) (response (optional principal) uint))
+))
+```
+
+### impl-trait \[#impl-trait]
+
+`impl-trait` declara que un contrato implementa un rasgo.
+
+**Firma**
+
+```clarity
+(impl-trait trait-identifier)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `trait-identifier` | rasgo | Rasgo a implementar |
+
+```clarity
+(impl-trait .token-trait.fungible-token)
+
+;; Multiple traits
+(impl-trait .dao-traits.proposal-trait)
+(impl-trait .dao-traits.voting-trait)
+```
+
+### uso-rasgo \[#use-trait]
+
+`use-trait` crea un alias de rasgo para usar en funciones.
+
+**Firma**
+
+```clarity
+(use-trait alias trait-identifier)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `alias` | símbolo | Alias local |
+| `trait-identifier` | rasgo | Rasgo a alias |
+
+```clarity
+(use-trait token-trait .token-trait.fungible-token)
+
+(define-public (swap (token ) (amount uint))
+ (contract-call? token transfer amount tx-sender .pool))
+```
+
+## Conversiones de tipo \[#type-conversions]
+
+### to-int \[#to-int]
+
+`to-int` convierte un entero sin signo a un entero con signo.
+
+**Firma**
+
+```clarity
+(to-int uint)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `uint` | `uint` | Entero sin signo |
+
+```clarity
+(to-int u100) ;; Returns 100
+(to-int u0) ;; Returns 0
+
+;; Convert for calculations
+(define-read-only (calculate-delta (a uint) (b uint))
+ (- (to-int a) (to-int b)))
+```
+
+### to-uint \[#to-uint]
+
+`to-uint` convierte un número entero con signo a un número entero sin signo.
+
+**Firma**
+
+```clarity
+(to-uint int)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `int` | `int` | Entero con signo |
+
+```clarity
+(to-uint 100) ;; Returns u100
+(to-uint -50) ;; Causes runtime error
+
+;; Safe conversion
+(define-read-only (safe-to-uint (value int))
+ (if (>= value 0)
+ (some (to-uint value))
+ none))
+```
+
+### ¿al consenso-buff? \[#to-consensus-buff]
+
+`to-consensus-buff?` serializa un valor al formato de consenso.
+
+**Firma**
+
+```clarity
+(to-consensus-buff? value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | cualquier | Valor para serializar |
+
+```clarity
+(to-consensus-buff? u100) ;; Returns (optional (buff 3))
+(to-consensus-buff? { a: u1, b: u2 }) ;; Serializes tuple
+
+;; Create hash of data
+(define-read-only (hash-value (data uint))
+ (match (to-consensus-buff? data)
+ buff (sha256 buff)
+ 0x00))
+```
+
+### from-consensus-buff? \[#from-consensus-buff]
+
+`from-consensus-buff?` deserializa desde el formato de consenso.
+
+**Firma**
+
+```clarity
+(from-consensus-buff? type buffer)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `type` | tipo-firma | Tipo esperado |
+| `buffer` | `buff` | Buffer para deserializar |
+
+```clarity
+(from-consensus-buff? uint 0x0100) ;; Returns (optional u1)
+(from-consensus-buff? { a: uint, b: uint } buff) ;; Deserialize tuple
+
+;; Parse stored data
+(define-read-only (decode-data (data (buff 128)))
+ (from-consensus-buff? { value: uint, timestamp: uint } data))
+```
+
+## Operaciones de bits \[#bit-operations]
+
+### bit-and \[#bit-and]
+
+`bit-and` realiza la operación AND a nivel de bits.
+
+**Firma**
+
+```clarity
+(bit-and i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(bit-and u12 u10) ;; Returns u8 (1100 & 1010 = 1000)
+(bit-and 0xFF 0x0F) ;; Returns 0x0F
+
+;; Check flags
+(define-read-only (has-permission (flags uint) (permission uint))
+ (> (bit-and flags permission) u0))
+```
+
+### bit-or \[#bit-or]
+
+`bit-or` realiza la operación OR a nivel de bits.
+
+**Firma**
+
+```clarity
+(bit-or i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(bit-or u12 u10) ;; Returns u14 (1100 | 1010 = 1110)
+(bit-or 0xF0 0x0F) ;; Returns 0xFF
+
+;; Set flags
+(define-public (add-permission (current uint) (new-permission uint))
+ (ok (bit-or current new-permission)))
+```
+
+### bit-xor \[#bit-xor]
+
+`bit-xor` realiza la operación XOR a nivel de bits.
+
+**Firma**
+
+```clarity
+(bit-xor i1 i2)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i1` | `int` o `uint` | Primer valor |
+| `i2` | `int` o `uint` | Segundo valor |
+
+```clarity
+(bit-xor u12 u10) ;; Returns u6 (1100 ^ 1010 = 0110)
+(bit-xor 0xFF 0xFF) ;; Returns 0x00
+
+;; Toggle flags
+(define-public (toggle-flag (flags uint) (flag uint))
+ (ok (bit-xor flags flag)))
+```
+
+### bit-not \[#bit-not]
+
+`bit-not` realiza la operación bitwise NOT.
+
+**Firma**
+
+```clarity
+(bit-not i)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i` | `int` o `uint` | Valor a invertir |
+
+```clarity
+(bit-not u0) ;; Returns maximum uint
+(bit-not 0xFF) ;; Returns -256
+
+;; Invert permissions
+(define-read-only (get-inverse-permissions (permissions uint))
+ (bit-not permissions))
+```
+
+### bit-shift-left \[#bit-shift-left]
+
+`bit-shift-left` desplaza bits hacia la izquierda.
+
+**Firma**
+
+```clarity
+(bit-shift-left i positions)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i` | `int` o `uint` | Valor a desplazar |
+| `positions` | `uint` | Posiciones a desplazar |
+
+```clarity
+(bit-shift-left u1 u3) ;; Returns u8 (1 << 3)
+(bit-shift-left u5 u2) ;; Returns u20
+
+;; Calculate power of 2
+(define-read-only (pow2 (exponent uint))
+ (bit-shift-left u1 exponent))
+```
+
+### bit-shift-right \[#bit-shift-right]
+
+`bit-shift-right` desplaza bits hacia la derecha.
+
+**Firma**
+
+```clarity
+(bit-shift-right i positions)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `i` | `int` o `uint` | Valor a desplazar |
+| `positions` | `uint` | Posiciones a desplazar |
+
+```clarity
+(bit-shift-right u8 u3) ;; Returns u1 (8 >> 3)
+(bit-shift-right u20 u2) ;; Returns u5
+
+;; Fast division by power of 2
+(define-read-only (div-pow2 (value uint) (exponent uint))
+ (bit-shift-right value exponent))
+```
+
+## Funciones de utilidad \[#utility-functions]
+
+### imprimir \[#print]
+
+`print` devuelve un valor y lo retorna.
+
+**Firma**
+
+```clarity
+(print value)
+```
+
+**Parámetros**
+
+| Nombre | Tipo | Descripción |
+|------|------|-------------|
+| `value` | cualquier | Valor a imprimir |
+
+```clarity
+(print "Debug message") ;; Prints and returns "Debug message"
+(print { event: "transfer", amount: u100 })
+
+;; Debug function
+(define-public (debug-transfer (amount uint))
+ (begin
+ (print { function: "transfer", amount: amount, sender: tx-sender })
+ (ok true)))
+```
diff --git a/content/docs/es/resources/clarity/reference/keywords.mdx b/content/docs/es/resources/clarity/reference/keywords.mdx
new file mode 100644
index 000000000..e006c6503
--- /dev/null
+++ b/content/docs/es/resources/clarity/reference/keywords.mdx
@@ -0,0 +1,560 @@
+---
+title: Referencia de palabras clave
+sidebarTitle: Palabras clave
+description: Referencia completa de todas las palabras clave de Clarity, incluyendo constantes, variables de contexto y datos de blockchain.
+isNew: true
+---
+Clarity proporciona palabras clave incorporadas para acceder al estado de la blockchain, el contexto de la transacción y valores constantes. Estas palabras clave permiten a los contratos inteligentes interactuar con la blockchain de Stacks y tomar decisiones basadas en el contexto de ejecución actual.
+
+* Constantes booleanas: [`true`](#true), [`false`](#false)
+* Constante opcional: [`none`](#none)
+* Información del bloque: [`block-height`](#block-height), [`burn-block-height`](#burn-block-height), [`stacks-block-height`](#stacks-block-height), [`tenure-height`](#tenure-height)
+* Contexto de la transacción: [`tx-sender`](#tx-sender), [`tx-sponsor`](#tx-sponsor), [`contract-caller`](#contract-caller)
+* Información de la cadena: [`chain-id`](#chain-id), [`is-in-mainnet`](#is-in-mainnet), [`is-in-regtest`](#is-in-regtest)
+* Datos económicos: [`stx-liquid-supply`](#stx-liquid-supply)
+
+## Constantes booleanas \[#boolean-constants]
+
+### verdadero \[#true]
+
+`true` representa el valor booleano verdadero en Clarity.
+
+**Tipo**
+
+```clarity
+bool
+```
+
+```clarity
+;; Direct usage
+(define-constant is-active true)
+
+;; In conditionals
+(if true
+ (print "This will execute")
+ (print "This won't execute"))
+
+;; Boolean operations
+(and true true) ;; Returns true
+(or false true) ;; Returns true
+```
+
+Los patrones comunes incluyen el uso de `true` para:
+
+* Estados habilitados por defecto en la configuración
+* Valores de retorno de éxito en funciones públicas
+* Banderas y conmutadores de características
+
+```clarity
+(define-data-var protocol-enabled bool true)
+
+(define-public (pause-protocol)
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (var-set protocol-enabled false)
+ (ok true)))
+
+;; Feature toggle pattern
+(define-map features (string-ascii 50) bool)
+(map-set features "trading" true)
+(map-set features "staking" true)
+```
+
+### falso \[#false]
+
+`false` representa el valor booleano falso en Clarity.
+
+**Tipo**
+
+```clarity
+bool
+```
+
+```clarity
+;; Direct usage
+(define-constant is-paused false)
+
+;; In conditionals
+(if false
+ (print "This won't execute")
+ (print "This will execute"))
+
+;; Boolean operations
+(and true false) ;; Returns false
+(or false false) ;; Returns false
+```
+
+Los patrones comunes incluyen el uso de `false` para:
+
+* Estados deshabilitados predeterminados
+* Indicadores de fallo
+* Estados iniciales no establecidos
+
+```clarity
+(define-data-var is-initialized bool false)
+
+(define-public (initialize)
+ (begin
+ (asserts! (not (var-get is-initialized)) (err u100))
+ (var-set is-initialized true)
+ (ok true)))
+
+;; Access control pattern
+(define-map admins principal bool)
+(define-read-only (is-admin (user principal))
+ (default-to false (map-get? admins user)))
+```
+
+## Constante opcional \[#optional-constant]
+
+### ninguno \[#ninguno]
+
+`none` representa un valor opcional vacío.
+
+**Tipo**
+
+```clarity
+(optional ?)
+```
+
+```clarity
+;; Direct usage
+(define-constant empty-value none)
+
+;; Optional map returns
+(map-get? non-existent-map non-existent-key) ;; Returns none
+
+;; Pattern matching
+(match (map-get? balances user)
+ balance (+ balance u100)
+ u0) ;; If none, return u0
+```
+
+Los patrones comunes incluyen:
+
+* Valores predeterminados para tipos opcionales
+* Representando la ausencia de datos
+* Estados iniciales antes de que se establezcan los datos
+
+```clarity
+(define-map user-profiles principal
+ {
+ name: (string-ascii 50),
+ created-at: uint
+ })
+
+(define-read-only (get-user-name (user principal))
+ (match (map-get? user-profiles user)
+ profile (some (get name profile))
+ none)) ;; Return none if profile doesn't exist
+
+;; Clearing optional data
+(define-data-var current-proposal (optional uint) none)
+(define-public (clear-proposal)
+ (begin
+ (var-set current-proposal none)
+ (ok true)))
+```
+
+## Información del bloque \[#block-information]
+
+### altura-del-bloque \[#altura-del-bloque]
+
+`block-height` devuelve la altura actual del bloque de Stacks.
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Get current height
+(print block-height)
+
+;; Time-locked functionality
+(define-public (claim-rewards)
+ (begin
+ (asserts! (> block-height u50000) (err u1))
+ (ok true)))
+```
+
+Los casos de uso incluyen:
+
+* Implementación de programas de adquisición de derechos
+* Creando fases basadas en tiempo
+* Grabación de marcas de tiempo
+* Aplicando retrasos
+
+```clarity
+(define-constant VESTING_START u100000)
+(define-constant VESTING_PERIOD u4320) ;; ~30 days
+
+(define-read-only (get-vested-amount (total uint))
+ (if (<= block-height VESTING_START)
+ u0
+ (let ((blocks-elapsed (- block-height VESTING_START)))
+ (if (>= blocks-elapsed VESTING_PERIOD)
+ total
+ (/ (* total blocks-elapsed) VESTING_PERIOD)))))
+
+;; Phase-based protocol
+(define-constant PHASE1_END u100000)
+(define-constant PHASE2_END u200000)
+
+(define-read-only (get-current-phase)
+ (if (<= block-height PHASE1_END)
+ u1
+ (if (<= block-height PHASE2_END)
+ u2
+ u3)))
+```
+
+### altura-del-bloque-quemado \[#altura-del-bloque-quemado]
+
+`burn-block-height` devuelve la altura actual del bloque de Bitcoin.
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Get current Bitcoin height
+(print burn-block-height)
+
+;; Bitcoin-anchored timing
+(define-read-only (get-burn-height-difference)
+ (- burn-block-height u700000))
+```
+
+Usos comunes:
+
+* Marcas de tiempo ancladas a Bitcoin
+* Coordinación de tiempos entre cadenas
+* Cálculos de Prueba de Transferencia
+
+```clarity
+(define-map btc-price-at-height uint uint)
+
+(define-public (record-btc-price (price uint))
+ (begin
+ (map-set btc-price-at-height burn-block-height price)
+ (ok burn-block-height)))
+
+;; Time calculations based on Bitcoin blocks
+(define-read-only (hours-since (btc-height uint))
+ (/ (- burn-block-height btc-height) u6)) ;; ~6 blocks per hour
+```
+
+### altura-del-bloque-stacks \[#altura-del-bloque-stacks]
+
+`stacks-block-height` devuelve la altura actual de la punta de la cadena Stacks (para Stacks 2.5+).
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Stacks 2.5+ specific height
+(print stacks-block-height)
+
+;; Height comparison
+(define-read-only (get-height-info)
+ {
+ stacks: stacks-block-height,
+ block: block-height,
+ difference: (- stacks-block-height block-height)
+ })
+```
+
+### altura-de-tenencia \[#altura-de-tenencia]
+
+`tenure-height` devuelve el número de tenencias (ciclos de recompensa) que han transcurrido.
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Get current tenure
+(print tenure-height)
+
+;; Tenure-based rewards
+(define-map tenure-rewards uint uint)
+
+(define-read-only (get-rewards-for-tenure (tenure uint))
+ (default-to u0 (map-get? tenure-rewards tenure)))
+```
+
+## Contexto de transacción \[#transaction-context]
+
+### tx-sender \[#tx-sender]
+
+`tx-sender` devuelve el principal que inició la transacción actual.
+
+**Tipo**
+
+```clarity
+principal
+```
+
+```clarity
+;; Get transaction originator
+(print tx-sender)
+
+;; Authorization pattern
+(define-constant contract-owner tx-sender)
+
+(define-public (admin-only-function)
+ (begin
+ (asserts! (is-eq tx-sender contract-owner) (err u401))
+ (ok true)))
+```
+
+Características clave:
+
+* Se mantiene constante durante todas las llamadas al contrato
+* Siempre representa al iniciador original de la transacción
+* Utilizado para autorización y propiedad
+
+```clarity
+(define-map balances principal uint)
+
+(define-public (deposit (amount uint))
+ (begin
+ (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
+ (map-set balances tx-sender
+ (+ (default-to u0 (map-get? balances tx-sender)) amount))
+ (ok amount)))
+
+;; Multi-signature pattern
+(define-map signers principal bool)
+(define-public (add-signature (proposal-id uint))
+ (begin
+ (asserts! (default-to false (map-get? signers tx-sender)) (err u401))
+ ;; Add signature logic
+ (ok true)))
+```
+
+### tx-sponsor \[#tx-sponsor]
+
+`tx-sponsor` devuelve el principal que paga las tarifas de transacción (opcional).
+
+**Tipo**
+
+```clarity
+(optional principal)
+```
+
+```clarity
+;; Check if transaction is sponsored
+(match tx-sponsor
+ sponsor (print { sponsored-by: sponsor })
+ (print "Not a sponsored transaction"))
+
+;; Get sponsor or sender
+(define-read-only (get-fee-payer)
+ (default-to tx-sender tx-sponsor))
+```
+
+Casos de uso:
+
+* Programas de subsidio de tarifas
+* Transacciones sin gas
+* Incorporación patrocinada
+* Adquisición de usuarios
+
+```clarity
+(define-map sponsored-actions { user: principal, sponsor: principal } uint)
+
+(define-public (sponsored-action)
+ (match tx-sponsor
+ sponsor (begin
+ ;; Record sponsored action
+ (map-set sponsored-actions
+ { user: tx-sender, sponsor: sponsor }
+ (+ (default-to u0 (map-get? sponsored-actions
+ { user: tx-sender, sponsor: sponsor })) u1))
+ (ok { user: tx-sender, sponsor: sponsor }))
+ (err u1))) ;; Must be sponsored
+
+;; Subsidized operations with approved sponsors
+(define-map approved-sponsors principal bool)
+
+(define-public (subsidized-transfer (recipient principal) (amount uint))
+ (match tx-sponsor
+ sponsor (begin
+ (asserts! (default-to false (map-get? approved-sponsors sponsor)) (err u401))
+ (ft-transfer? my-token amount tx-sender recipient))
+ ;; Not sponsored - user pays normally
+ (ft-transfer? my-token amount tx-sender recipient)))
+```
+
+### contract-caller \[#contract-caller]
+
+`contract-caller` devuelve el principal llamante inmediato (contrato o usuario).
+
+**Tipo**
+
+```clarity
+principal
+```
+
+```clarity
+;; Get immediate caller
+(print contract-caller)
+
+;; Direct-call only
+(define-public (direct-only)
+ (begin
+ (asserts! (is-eq tx-sender contract-caller) (err u405))
+ (ok true)))
+```
+
+Distinciones importantes:
+
+* Cambios con cada llamada de contrato
+* Igual a `tx-sender` para llamadas directas
+* Representa el contrato que llama en llamadas de contrato a contrato
+
+```clarity
+;; Contract A
+(define-public (call-contract-b)
+ (contract-call? .contract-b check-callers))
+
+;; Contract B
+(define-public (check-callers)
+ (begin
+ (print {
+ tx-sender: tx-sender, ;; Original user
+ contract-caller: contract-caller ;; Contract A
+ })
+ (ok true)))
+
+;; Allowlist pattern
+(define-map allowed-contracts principal bool)
+(define-public (restricted-function)
+ (begin
+ (asserts!
+ (or
+ (is-eq tx-sender contract-caller) ;; Direct call
+ (default-to false (map-get? allowed-contracts contract-caller)))
+ (err u401))
+ (ok true)))
+```
+
+## Información de la cadena \[#chain-information]
+
+### chain-id \[#chain-id]
+
+`chain-id` devuelve el identificador de cadena de 32 bytes.
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Get chain ID
+(print chain-id)
+
+;; Mainnet: 0x00000001
+;; Testnet: 0x80000000
+```
+
+### está-en-mainnet \[#esta-en-mainnet]
+
+`is-in-mainnet` devuelve true si el contrato se está ejecutando en la red principal.
+
+**Tipo**
+
+```clarity
+bool
+```
+
+```clarity
+;; Check if on mainnet
+(asserts! is-in-mainnet (err u500))
+
+;; Environment-specific constants
+(define-constant TOKEN-SUPPLY
+ (if is-in-mainnet
+ u1000000000 ;; 1 billion on mainnet
+ u1000000)) ;; 1 million on testnet
+```
+
+### está-en-regtest \[#esta-en-regtest]
+
+`is-in-regtest` devuelve true si el contrato se está ejecutando en regtest.
+
+**Tipo**
+
+```clarity
+bool
+```
+
+```clarity
+;; Development-only functions
+(define-public (debug-function)
+ (begin
+ (asserts! is-in-regtest (err u403))
+ ;; Debug logic
+ (ok true)))
+```
+
+## Datos económicos \[#economic-data]
+
+### suministro-líquido-de-stx \[#suministro-líquido-de-stx]
+
+`stx-liquid-supply` devuelve el suministro total de STX líquido en micro-STX.
+
+**Tipo**
+
+```clarity
+uint
+```
+
+```clarity
+;; Get current liquid supply
+(print stx-liquid-supply)
+
+;; Calculate percentage of supply
+(define-read-only (get-percent-of-liquid (amount uint))
+ (/ (* amount u10000) stx-liquid-supply)) ;; Returns basis points
+```
+
+Casos de uso:
+
+* Cálculos económicos
+* Límites basados en el suministro
+* Implementaciones de tokenomía
+* Umbrales de gobernanza
+
+```clarity
+;; Dynamic fee based on supply percentage
+(define-constant FEE_BASIS_POINTS u50) ;; 0.5%
+
+(define-read-only (calculate-dynamic-fee (amount uint))
+ (let (
+ (supply-ratio (/ (* amount u1000000) stx-liquid-supply))
+ (multiplier (+ u100 supply-ratio)))
+ (/ (* amount FEE_BASIS_POINTS multiplier) u10000)))
+
+;; Governance with supply-based thresholds
+(define-constant PROPOSAL_THRESHOLD_BASIS u100) ;; 1% of liquid supply
+
+(define-public (create-proposal (description (string-utf8 500)))
+ (let (
+ (required-stake (/ (* stx-liquid-supply PROPOSAL_THRESHOLD_BASIS) u10000))
+ (user-balance (stx-get-balance tx-sender)))
+ (asserts! (>= user-balance required-stake) (err u402))
+ (try! (stx-transfer? required-stake tx-sender (as-contract tx-sender)))
+ (ok required-stake)))
+```
diff --git a/content/docs/es/resources/clarity/reference/types.mdx b/content/docs/es/resources/clarity/reference/types.mdx
new file mode 100644
index 000000000..b0e7ab4f2
--- /dev/null
+++ b/content/docs/es/resources/clarity/reference/types.mdx
@@ -0,0 +1,193 @@
+---
+title: Referencia de tipos
+sidebarTitle: Tipos
+description: El sistema de tipos de Clarity garantiza la corrección del programa mediante la comprobación estática de tipos
+---
+Clarity utiliza un sistema de tipos estático robusto. Los argumentos de las funciones y los esquemas de bases de datos requieren tipos especificados, y todos los tipos son conocidos al momento de la publicación.
+
+## Tipos primitivos
+
+### int
+
+Entero con signo de 128 bits. Rango desde -2^127 hasta 2^127 - 1.
+
+```clarity
+(define-constant my-int -10)
+(define-constant max-int 170141183460469231731687303715884105727)
+```
+
+### uint
+
+Entero sin signo de 128 bits. Rango de 0 a 2^128 - 1.
+
+```clarity
+(define-constant my-uint u10)
+(define-constant max-uint u340282366920938463463374607431768211455)
+```
+
+### booleano
+
+Valor booleano que representa verdadero o falso.
+
+```clarity
+(define-constant is-active true)
+(define-constant is-disabled false)
+```
+
+### principal
+
+Representa un objeto que puede tener un saldo de tokens. Puede ser un principal estándar (dirección de usuario) o un principal de contrato.
+
+```clarity
+;; Standard principal
+'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+
+;; Contract principal
+'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.contract-name
+```
+
+## Tipos de secuencias
+
+### (buff max-len)
+
+Búfer de bytes con una longitud máxima. Utilizado para datos binarios arbitrarios.
+
+```clarity
+(define-constant my-buff 0x68656c6c6f) ;; "hello" in hex
+(define-data-var message (buff 20) 0x00)
+```
+
+### (cadena-ascii longitud-máxima)
+
+Cadena ASCII con longitud máxima. Solo admite caracteres ASCII.
+
+```clarity
+(define-constant name (string-ascii 50) "Clarity")
+(define-data-var user-name (string-ascii 100) "")
+```
+
+### (cadena-utf8 longitud-máxima)
+
+Cadena UTF-8 con longitud máxima. Admite caracteres Unicode.
+
+```clarity
+(define-constant greeting (string-utf8 50) u"Hello L! =�")
+(define-data-var status-message (string-utf8 280) u"")
+```
+
+### (lista longitud-máxima tipo-entrada)
+
+Lista homogénea con longitud máxima especificada y tipo de entrada.
+
+```clarity
+(define-constant numbers (list 5 uint) (list u1 u2 u3 u4 u5))
+(define-data-var prices (list 100 uint) (list))
+```
+
+## Tipos compuestos
+
+### Tupla
+
+Registro con campos nombrados. Cada campo tiene un tipo especificado.
+
+```clarity
+{
+ name: (string-ascii 50),
+ age: uint,
+ active: bool
+}
+
+;; Example usage
+(define-constant user {
+ name: "Alice",
+ age: u30,
+ active: true
+})
+```
+
+Los tuples se utilizan comúnmente para:
+
+* Devolviendo múltiples valores desde funciones
+* Estructurando datos complejos
+* Mapear claves y valores
+
+## Tipos especiales
+
+### (tipo opcional)
+
+Representa un valor que podría no existir. Puede ser `(some value)` o `none`.
+
+```clarity
+(define-data-var winner (optional principal) none)
+
+;; Set value
+(var-set winner (some 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM))
+
+;; Check value
+(match (var-get winner)
+ user (print user)
+ (print "No winner yet")
+)
+```
+
+### (respuesta tipo-ok tipo-err)
+
+Utilizado por funciones públicas para indicar éxito o fracaso. Las respuestas exitosas confirman los cambios de estado, mientras que las respuestas de error abortan todos los cambios.
+
+```clarity
+(define-public (divide (a uint) (b uint))
+ (if (is-eq b u0)
+ (err u1) ;; Division by zero error
+ (ok (/ a b))
+ )
+)
+```
+
+Los tipos de respuesta permiten:
+
+* Semántica de transacciones atómicas
+* Manejo de errores componible
+* Rutas claras de éxito/fracaso
+
+## Firmas de tipo
+
+Las funciones deben especificar firmas de tipo completas:
+
+```clarity
+;; Read-only function
+(define-read-only (get-balance (user principal))
+ (response uint uint)
+ ;; Function body
+)
+
+;; Public function
+(define-public (transfer (amount uint) (recipient principal))
+ (response bool uint)
+ ;; Function body
+)
+
+;; Private function
+(define-private (validate-amount (amount uint))
+ bool
+ ;; Function body
+)
+```
+
+## Inferencia de tipos
+
+Si bien Clarity requiere anotaciones de tipo explícitas para las firmas de funciones y declaraciones de datos, puede inferir tipos dentro de los cuerpos de las funciones:
+
+```clarity
+(define-read-only (calculate)
+ (let ((x 10) ;; Inferred as int
+ (y u20) ;; Inferred as uint
+ (name "Test")) ;; Inferred as string-ascii
+ (ok x))
+)
+```
+
+:::callout
+### Seguridad de tipos
+
+El sistema de tipos de Clarity previene muchos errores comunes de programación en el momento de la publicación, antes de que se ejecute cualquier código. Esto incluye incompatibilidades de tipos, excepciones de puntero nulo y desbordamientos de búfer.
+:::
diff --git a/content/docs/es/resources/guides/api-keys.mdx b/content/docs/es/resources/guides/api-keys.mdx
new file mode 100644
index 000000000..0ff7f4981
--- /dev/null
+++ b/content/docs/es/resources/guides/api-keys.mdx
@@ -0,0 +1,45 @@
+---
+title: Claves de API
+description: Para desarrolladores que necesitan solicitudes de API más allá de los límites de velocidad estándar.
+---
+Los desarrolladores tienen acceso abierto a las API de Hiro sin necesidad de una clave API, pero están sujetos a [Política de límite de tasa de Hiro](/resources/guides/rate-limits). Para los desarrolladores que necesitan acceso más allá de estos límites de velocidad, proporcionamos claves de API.
+
+:::callout
+Si estás interesado en obtener una clave de API, puedes generar una gratis en el [Plataforma Hiro](https://platform.hiro.so) creando una cuenta.
+
+Si su aplicación necesita más de 500 RPM, por favor [contáctenos](mailto\:platform@hiro.so).
+:::
+
+## Uso con cURL
+
+La clave de API se pasa en el `header` de su solicitud de API HTTP con `x-api-key`.
+
+```terminal
+$ curl https://api.hiro.so/... -H 'x-api-key: '
+```
+
+## Uso con Node
+
+Este fragmento muestra cómo realizar una `fetch` solicitud con tu clave de API incluyéndola en los encabezados de la solicitud.
+
+```ts fetch.ts
+async function makeApiRequest(apiKey: string) {
+ const url = `https://api.hiro.so/`;
+ const response = await fetch(url, {
+ headers: {
+ "x-api-key": apiKey
+ }
+ });
+ return response.json();
+}
+```
+
+:::callout
+type: warn
+
+### Precaución
+
+La clave de API se pasa en el encabezado de tu solicitud de API HTTP y se utiliza solo para uso privado, como en aplicaciones del lado del servidor.
+
+Si utiliza la clave de API en su aplicación del lado del cliente, los atacantes pueden capturarla utilizando las herramientas del cliente (por ejemplo, la consola del navegador) y abusar de su clave de API.
+:::
diff --git a/content/docs/es/resources/guides/build-a-decentralized-kickstarter.mdx b/content/docs/es/resources/guides/build-a-decentralized-kickstarter.mdx
new file mode 100644
index 000000000..a8dc091b0
--- /dev/null
+++ b/content/docs/es/resources/guides/build-a-decentralized-kickstarter.mdx
@@ -0,0 +1,286 @@
+---
+title: Construye un Kickstarter descentralizado
+description: Aprende cómo crear una aplicación de crowdfunding, permitiendo a los creadores financiar sus proyectos sin un tercero.
+---
+import { Code, Terminal } from 'lucide-react';
+import { SmallCard } from '@/components/card';
+
+En esta guía, aprenderás cómo crear un mercado de NFT que permite a los usuarios listar NFTs para la venta. Los usuarios pueden especificar los siguientes detalles para sus listados:
+
+* El token NFT para vender.
+* Vencimiento del listado en altura de bloque.
+* El activo de pago, ya sea STX o un token fungible SIP010.
+* El precio del NFT en el activo de pago elegido.
+* Un tomador previsto opcional. Si se establece, solo ese principal podrá cumplir con el listado.
+
+Este mercado aprovecha los siguientes rasgos de Clarity:
+
+* `nft-trait` para manejar NFTs.
+* `ft-trait` para manejar tokens fungibles.
+
+A lo largo de esta guía, aprenderás cómo:
+
+1. Define y maneja errores.
+2. Crea y gestiona listados de NFT.
+3. Incluir contratos de activos en la lista blanca.
+4. Cumplir con las compras de NFT.
+
+***
+
+## Definir y manejar errores
+
+Primero, define constantes para varios errores que pueden ocurrir durante el listado, cancelación o cumplimiento de transacciones de NFT. Esto ayuda a mantener un código limpio y legible.
+
+```clarity
+;; Define listing errors
+(define-constant ERR_EXPIRY_IN_PAST (err u1000))
+(define-constant ERR_PRICE_ZERO (err u1001))
+
+;; Define cancelling and fulfilling errors
+(define-constant ERR_UNKNOWN_LISTING (err u2000))
+(define-constant ERR_UNAUTHORISED (err u2001))
+(define-constant ERR_LISTING_EXPIRED (err u2002))
+(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))
+(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))
+(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))
+(define-constant ERR_UNINTENDED_TAKER (err u2006))
+(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))
+(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))
+```
+
+## Crear y gestionar listados de NFT
+
+### Definir estructuras de datos
+
+Crea una estructura de datos de mapa para los listados de activos y una variable de datos para IDs únicos.
+
+```clarity
+;; Define a map data structure for the asset listings
+(define-map listings
+ uint
+ {
+ maker: principal,
+ taker: (optional principal),
+ token-id: uint,
+ nft-asset-contract: principal,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ }
+)
+
+;; Used for unique IDs for each listing
+(define-data-var listing-nonce uint u0)
+```
+
+### Listar un activo
+
+Crea una función pública para listar un activo junto con su contrato. Esta función verifica el contrato, comprueba la caducidad y el precio, y transfiere la propiedad del NFT al mercado.
+
+```clarity
+(define-public (list-asset
+ (nft-asset-contract )
+ (nft-asset {
+ taker: (optional principal),
+ token-id: uint,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ })
+)
+ (let ((listing-id (var-get listing-nonce)))
+ ;; Verify that the contract of this asset is whitelisted
+ (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)
+ ;; Verify that the asset is not expired
+ (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)
+ ;; Verify that the asset price is greater than zero
+ (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)
+ ;; Verify that the contract of the payment is whitelisted
+ (asserts! (match (get payment-asset-contract nft-asset)
+ payment-asset
+ (is-whitelisted payment-asset)
+ true
+ ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)
+ ;; Transfer the NFT ownership to this contract's principal
+ (try! (transfer-nft
+ nft-asset-contract
+ (get token-id nft-asset)
+ tx-sender
+ (as-contract tx-sender)
+ ))
+ ;; List the NFT in the listings map
+ (map-set listings listing-id (merge
+ { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }
+ nft-asset
+ ))
+ ;; Increment the nonce to use for the next unique listing ID
+ (var-set listing-nonce (+ listing-id u1))
+ ;; Return the created listing ID
+ (ok listing-id)
+ )
+)
+```
+
+### Recuperar un activo
+
+Crea una función de solo lectura para recuperar un activo, o listado, por su ID.
+
+```clarity
+(define-read-only (get-listing (listing-id uint))
+ (map-get? listings listing-id)
+)
+```
+
+### Cancelar un anuncio
+
+Crea una función pública para cancelar un listado. Solo el creador del NFT puede cancelar el listado, y debe usar el mismo contrato de activo que utiliza el NFT.
+
+```clarity
+(define-public (cancel-listing (listing-id uint) (nft-asset-contract ))
+ (let (
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ (maker (get maker listing))
+ )
+ ;; Verify that the caller of the function is the creator of the NFT to be cancelled
+ (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)
+ ;; Verify that the asset contract to use is the same one that the NFT uses
+ (asserts! (is-eq
+ (get nft-asset-contract listing)
+ (contract-of nft-asset-contract)
+ ) ERR_NFT_ASSET_MISMATCH)
+ ;; Delete the listing
+ (map-delete listings listing-id)
+ ;; Transfer the NFT from this contract's principal back to the creator's principal
+ (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))
+ )
+)
+```
+
+## Contratos de activos en lista blanca
+
+### Contratos de lista blanca
+
+El mercado requiere que cualquier contrato utilizado para activos o pagos sea incluido en la lista blanca por el propietario del contrato. Crea un mapa para almacenar los contratos de activos en la lista blanca y una función para verificar si un contrato está en la lista blanca.
+
+```clarity
+(define-map whitelisted-asset-contracts principal bool)
+
+(define-read-only (is-whitelisted (asset-contract principal))
+ (default-to false (map-get? whitelisted-asset-contracts asset-contract))
+)
+```
+
+### Establecer contratos en lista blanca
+
+Solo el propietario del contrato puede incluir en la lista blanca un contrato de activo. Cree una función pública para establecer contratos de activos en la lista blanca.
+
+```clarity
+(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))
+ (begin
+ (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)
+ (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))
+ )
+)
+```
+
+## Cumplir compras de NFT
+
+### Cumplir listado con STX
+
+Crea una función pública para comprar un listado utilizando STX como pago.
+
+```clarity
+(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract ))
+ (let (
+ ;; Verify the given listing ID exists
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ ;; Set the NFT's taker to the purchaser (caller of the function)
+ (taker tx-sender)
+ )
+ ;; Validate that the purchase can be fulfilled
+ (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))
+ ;; Transfer the NFT to the purchaser (caller of the function)
+ (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))
+ ;; Transfer the STX payment from the purchaser to the creator of the NFT
+ (try! (stx-transfer? (get price listing) taker (get maker listing)))
+ ;; Remove the NFT from the marketplace listings
+ (map-delete listings listing-id)
+ ;; Return the listing ID that was just purchased
+ (ok listing-id)
+ )
+)
+```
+
+### Cumplir listado con SIP-010
+
+Crea una función pública para comprar un listado utilizando otro token fungible que siga el estándar SIP-010 como pago.
+
+```clarity
+(define-public (fulfil-listing-ft
+ (listing-id uint)
+ (nft-asset-contract )
+ (payment-asset-contract )
+)
+ (let (
+ ;; Verify the given listing ID exists
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ ;; Set the NFT's taker to the purchaser (caller of the function)
+ (taker tx-sender)
+ )
+ ;; Validate that the purchase can be fulfilled
+ (try! (assert-can-fulfil
+ (contract-of nft-asset-contract)
+ (some (contract-of payment-asset-contract))
+ listing
+ ))
+ ;; Transfer the NFT to the purchaser (caller of the function)
+ (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))
+ ;; Transfer the tokens as payment from the purchaser to the creator of the NFT
+ (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))
+ ;; Remove the NFT from the marketplace listings
+ (map-delete listings listing-id)
+ ;; Return the listing ID that was just purchased
+ (ok listing-id)
+ )
+)
+```
+
+### Validar que la compra se pueda realizar
+
+Crea una función privada para validar que una compra pueda ser cumplida. Esta función verifica la caducidad del listado, el contrato del NFT y el contrato del pago.
+
+```clarity
+(define-private (assert-can-fulfil
+ (nft-asset-contract principal)
+ (payment-asset-contract (optional principal))
+ (listing {
+ maker: principal,
+ taker: (optional principal),
+ token-id: uint,
+ nft-asset-contract: principal,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ })
+)
+ (begin
+ ;; Verify that the buyer is not the same as the NFT creator
+ (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)
+ ;; Verify the buyer has been set in the listing metadata as its `taker`
+ (asserts!
+ (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)
+ ERR_UNINTENDED_TAKER
+ )
+ ;; Verify the listing for purchase is not expired
+ (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)
+ ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT
+ (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)
+ ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT
+ (asserts!
+ (is-eq (get payment-asset-contract listing) payment-asset-contract)
+ ERR_PAYMENT_ASSET_MISMATCH
+ )
+ (ok true)
+ )
+)
+```
diff --git a/content/docs/es/resources/guides/build-an-nft-marketplace.mdx b/content/docs/es/resources/guides/build-an-nft-marketplace.mdx
new file mode 100644
index 000000000..48bd1ca9e
--- /dev/null
+++ b/content/docs/es/resources/guides/build-an-nft-marketplace.mdx
@@ -0,0 +1,286 @@
+---
+title: Construir un mercado de NFT
+description: Aprende cómo crear un mercado de NFT que permita a los usuarios listar NFTs para la venta y comprarlos usando Clarity.
+---
+import { Code, Terminal } from 'lucide-react';
+import { SmallCard } from '@/components/card';
+
+En esta guía, aprenderás cómo crear un mercado de NFT que permite a los usuarios listar NFTs para la venta. Los usuarios pueden especificar los siguientes detalles para sus listados:
+
+* El token NFT para vender.
+* Vencimiento del listado en altura de bloque.
+* El activo de pago, ya sea STX o un token fungible SIP010.
+* El precio del NFT en el activo de pago elegido.
+* Un tomador previsto opcional. Si se establece, solo ese principal podrá cumplir con el listado.
+
+Este mercado aprovecha los siguientes rasgos de Clarity:
+
+* `nft-trait` para manejar NFTs.
+* `ft-trait` para manejar tokens fungibles.
+
+A lo largo de esta guía, aprenderás cómo:
+
+1. Define y maneja errores.
+2. Crea y gestiona listados de NFT.
+3. Incluir contratos de activos en la lista blanca.
+4. Cumplir con las compras de NFT.
+
+***
+
+## Definir y manejar errores
+
+Primero, define constantes para varios errores que pueden ocurrir durante el listado, cancelación o cumplimiento de transacciones de NFT. Esto ayuda a mantener un código limpio y legible.
+
+```clarity
+;; Define listing errors
+(define-constant ERR_EXPIRY_IN_PAST (err u1000))
+(define-constant ERR_PRICE_ZERO (err u1001))
+
+;; Define cancelling and fulfilling errors
+(define-constant ERR_UNKNOWN_LISTING (err u2000))
+(define-constant ERR_UNAUTHORISED (err u2001))
+(define-constant ERR_LISTING_EXPIRED (err u2002))
+(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))
+(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))
+(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))
+(define-constant ERR_UNINTENDED_TAKER (err u2006))
+(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))
+(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))
+```
+
+## Crear y gestionar listados de NFT
+
+### Definir estructuras de datos
+
+Crea una estructura de datos de mapa para los listados de activos y una variable de datos para IDs únicos.
+
+```clarity
+;; Define a map data structure for the asset listings
+(define-map listings
+ uint
+ {
+ maker: principal,
+ taker: (optional principal),
+ token-id: uint,
+ nft-asset-contract: principal,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ }
+)
+
+;; Used for unique IDs for each listing
+(define-data-var listing-nonce uint u0)
+```
+
+### Listar un activo
+
+Crea una función pública para listar un activo junto con su contrato. Esta función verifica el contrato, comprueba la caducidad y el precio, y transfiere la propiedad del NFT al mercado.
+
+```clarity
+(define-public (list-asset
+ (nft-asset-contract )
+ (nft-asset {
+ taker: (optional principal),
+ token-id: uint,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ })
+)
+ (let ((listing-id (var-get listing-nonce)))
+ ;; Verify that the contract of this asset is whitelisted
+ (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)
+ ;; Verify that the asset is not expired
+ (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)
+ ;; Verify that the asset price is greater than zero
+ (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)
+ ;; Verify that the contract of the payment is whitelisted
+ (asserts! (match (get payment-asset-contract nft-asset)
+ payment-asset
+ (is-whitelisted payment-asset)
+ true
+ ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)
+ ;; Transfer the NFT ownership to this contract's principal
+ (try! (transfer-nft
+ nft-asset-contract
+ (get token-id nft-asset)
+ tx-sender
+ (as-contract tx-sender)
+ ))
+ ;; List the NFT in the listings map
+ (map-set listings listing-id (merge
+ { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }
+ nft-asset
+ ))
+ ;; Increment the nonce to use for the next unique listing ID
+ (var-set listing-nonce (+ listing-id u1))
+ ;; Return the created listing ID
+ (ok listing-id)
+ )
+)
+```
+
+### Recuperar un activo
+
+Crea una función de solo lectura para recuperar un activo, o listado, por su ID.
+
+```clarity
+(define-read-only (get-listing (listing-id uint))
+ (map-get? listings listing-id)
+)
+```
+
+### Cancelar un anuncio
+
+Crea una función pública para cancelar un listado. Solo el creador del NFT puede cancelar el listado, y debe usar el mismo contrato de activo que utiliza el NFT.
+
+```clarity
+(define-public (cancel-listing (listing-id uint) (nft-asset-contract ))
+ (let (
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ (maker (get maker listing))
+ )
+ ;; Verify that the caller of the function is the creator of the NFT to be cancelled
+ (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)
+ ;; Verify that the asset contract to use is the same one that the NFT uses
+ (asserts! (is-eq
+ (get nft-asset-contract listing)
+ (contract-of nft-asset-contract)
+ ) ERR_NFT_ASSET_MISMATCH)
+ ;; Delete the listing
+ (map-delete listings listing-id)
+ ;; Transfer the NFT from this contract's principal back to the creator's principal
+ (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))
+ )
+)
+```
+
+## Contratos de activos en lista blanca
+
+### Contratos de lista blanca
+
+El mercado requiere que cualquier contrato utilizado para activos o pagos sea incluido en la lista blanca por el propietario del contrato. Crea un mapa para almacenar los contratos de activos en la lista blanca y una función para verificar si un contrato está en la lista blanca.
+
+```clarity
+(define-map whitelisted-asset-contracts principal bool)
+
+(define-read-only (is-whitelisted (asset-contract principal))
+ (default-to false (map-get? whitelisted-asset-contracts asset-contract))
+)
+```
+
+### Establecer contratos en lista blanca
+
+Solo el propietario del contrato puede incluir en la lista blanca un contrato de activo. Cree una función pública para establecer contratos de activos en la lista blanca.
+
+```clarity
+(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))
+ (begin
+ (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)
+ (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))
+ )
+)
+```
+
+## Cumplir compras de NFT
+
+### Cumplir listado con STX
+
+Crea una función pública para comprar un listado utilizando STX como pago.
+
+```clarity
+(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract ))
+ (let (
+ ;; Verify the given listing ID exists
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ ;; Set the NFT's taker to the purchaser (caller of the function)
+ (taker tx-sender)
+ )
+ ;; Validate that the purchase can be fulfilled
+ (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))
+ ;; Transfer the NFT to the purchaser (caller of the function)
+ (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))
+ ;; Transfer the STX payment from the purchaser to the creator of the NFT
+ (try! (stx-transfer? (get price listing) taker (get maker listing)))
+ ;; Remove the NFT from the marketplace listings
+ (map-delete listings listing-id)
+ ;; Return the listing ID that was just purchased
+ (ok listing-id)
+ )
+)
+```
+
+### Cumplir listado con SIP-010
+
+Crea una función pública para comprar un listado utilizando otro token fungible que siga el estándar SIP-010 como pago.
+
+```clarity
+(define-public (fulfil-listing-ft
+ (listing-id uint)
+ (nft-asset-contract )
+ (payment-asset-contract )
+)
+ (let (
+ ;; Verify the given listing ID exists
+ (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))
+ ;; Set the NFT's taker to the purchaser (caller of the function)
+ (taker tx-sender)
+ )
+ ;; Validate that the purchase can be fulfilled
+ (try! (assert-can-fulfil
+ (contract-of nft-asset-contract)
+ (some (contract-of payment-asset-contract))
+ listing
+ ))
+ ;; Transfer the NFT to the purchaser (caller of the function)
+ (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))
+ ;; Transfer the tokens as payment from the purchaser to the creator of the NFT
+ (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))
+ ;; Remove the NFT from the marketplace listings
+ (map-delete listings listing-id)
+ ;; Return the listing ID that was just purchased
+ (ok listing-id)
+ )
+)
+```
+
+### Validar que la compra se pueda realizar
+
+Crea una función privada para validar que una compra pueda ser cumplida. Esta función verifica la expiración del listado, el contrato del NFT y el contrato del pago.
+
+```clarity
+(define-private (assert-can-fulfil
+ (nft-asset-contract principal)
+ (payment-asset-contract (optional principal))
+ (listing {
+ maker: principal,
+ taker: (optional principal),
+ token-id: uint,
+ nft-asset-contract: principal,
+ expiry: uint,
+ price: uint,
+ payment-asset-contract: (optional principal)
+ })
+)
+ (begin
+ ;; Verify that the buyer is not the same as the NFT creator
+ (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)
+ ;; Verify the buyer has been set in the listing metadata as its `taker`
+ (asserts!
+ (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)
+ ERR_UNINTENDED_TAKER
+ )
+ ;; Verify the listing for purchase is not expired
+ (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)
+ ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT
+ (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)
+ ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT
+ (asserts!
+ (is-eq (get payment-asset-contract listing) payment-asset-contract)
+ ERR_PAYMENT_ASSET_MISMATCH
+ )
+ (ok true)
+ )
+)
+```
diff --git a/content/docs/es/resources/guides/index.mdx b/content/docs/es/resources/guides/index.mdx
new file mode 100644
index 000000000..400a9476d
--- /dev/null
+++ b/content/docs/es/resources/guides/index.mdx
@@ -0,0 +1,28 @@
+---
+title: Guías
+sidebarTitle: Visión general
+description: Guías para construir en Stacks.
+llm: false
+---
+## Visión general
+
+Para explorar Guías con IA, copie y pegue [llms.txt](/resources/guides/llms.txt) en tu LLM de preferencia.
+
+## Construyendo Proyectos
+
+* [Construye un Mercado de NFT](/resources/guides/build-an-nft-marketplace) - Guía para construir un mercado de NFT descentralizado en Stacks.
+* [Construye un Kickstarter Descentralizado](/resources/guides/build-a-decentralized-kickstarter) - Guía para crear una plataforma de financiación colectiva descentralizada.
+
+## Stacks.js
+
+* [Uso de los valores de Clarity](/resources/guides/using-clarity-values) - Aprende cómo usar los valores de Clarity en tus aplicaciones.
+
+## Aplicaciones
+
+* [Lotería sin Pérdidas](/resources/guides/no-loss-lottery) - Guía para construir una aplicación de lotería sin pérdidas.
+
+## Infraestructura
+
+* [Instalando Docker](/resources/guides/installing-docker) - Instrucciones para configurar Docker para desarrollo.
+* [Sincronizar un Nodo de Bitcoin](/resources/guides/sync-a-bitcoin-node) - Guía para sincronizar un nodo de Bitcoin.
+* [Sincronizar un Nodo de Stacks](/resources/guides/sync-a-stacks-node) - Guía para sincronizar un nodo de Stacks.
diff --git a/content/docs/es/resources/guides/installing-docker.mdx b/content/docs/es/resources/guides/installing-docker.mdx
new file mode 100644
index 000000000..10cf8c5bf
--- /dev/null
+++ b/content/docs/es/resources/guides/installing-docker.mdx
@@ -0,0 +1,47 @@
+---
+title: Cómo instalar Docker
+description: Instale Docker para ejecutar una devnet local.
+---
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+
+
+
+ 1. Ve al [Docker Desktop para Mac](https://www.docker.com/products/docker-desktop/) página.
+ 2. Descargue el archivo .dmg.
+ 3. Abra el archivo .dmg descargado.
+ 4. Arrastra el icono de Docker a la carpeta Aplicaciones.
+ 5. Abra Docker desde la carpeta Aplicaciones.
+ 6. Conceda los permisos necesarios si se le solicita.
+ 7. El icono de Docker Desktop aparecerá en la barra de menú indicando que Docker está en ejecución.
+
+ Para verificar la instalación, ejecute `docker --version` en su terminal. Debería ver la información de la versión de Docker.
+
+
+
+ 1. Ve al [Docker Desktop para Windows](https://www.docker.com/products/docker-desktop/) página.
+ 2. Descargue el ejecutable.
+ 3. Ejecute el archivo ejecutable descargado.
+ 4. Siga los pasos del asistente de instalación (es posible que deba reiniciar su computadora).
+ 5. Asegúrese de que el backend de WSL 2 (Subsistema de Windows para Linux) esté marcado durante la instalación, si corresponde.
+ 6. Abra Docker Desktop desde el menú Inicio.
+ 7. Conceda los permisos necesarios si se le solicita.
+ 8. El icono de Docker aparecerá en la bandeja del sistema indicando que Docker está en ejecución.
+
+ Para verificar la instalación, ejecute `docker --version` en su terminal. Debería ver la información de la versión de Docker.
+
+ :::callout
+ ### Instalación de Windows
+
+ Es posible que necesite instalar componentes adicionales de Windows como Hyper-V o WSL 2.
+ :::
+
+
+
+***
+
+## Próximos pasos
+
+:::next-steps
+* [Sincronizar un nodo de Bitcoin](/resources/guides/sync-a-bitcoin-node): Aprende cómo sincronizar un nodo de Bitcoin para ejecutar Chainhook como un servicio.
+* [Sincronizar un nodo de Stacks](/resources/guides/sync-a-stacks-node): Aprende cómo sincronizar un nodo de Stacks para ejecutar una devnet local.
+:::
diff --git a/content/docs/es/resources/guides/meta.json b/content/docs/es/resources/guides/meta.json
new file mode 100644
index 000000000..dad1610fa
--- /dev/null
+++ b/content/docs/es/resources/guides/meta.json
@@ -0,0 +1,25 @@
+{
+ "title": "guides",
+ "root": true,
+ "pages": [
+ "---Guides---",
+ "index",
+ "---APIs---",
+ "api-keys",
+ "rate-limits",
+ "response-headers",
+ "---Building Projects---",
+ "build-an-nft-marketplace",
+ "build-a-decentralized-kickstarter",
+ "---Stacks.js---",
+ "using-clarity-values",
+ "---Applications---",
+ "no-loss-lottery",
+ "---Integrations---",
+ "using-pyth-price-feeds",
+ "---Infrastructure---",
+ "installing-docker",
+ "sync-a-bitcoin-node",
+ "sync-a-stacks-node"
+ ]
+}
diff --git a/content/docs/es/resources/guides/no-loss-lottery.mdx b/content/docs/es/resources/guides/no-loss-lottery.mdx
new file mode 100644
index 000000000..c067227b4
--- /dev/null
+++ b/content/docs/es/resources/guides/no-loss-lottery.mdx
@@ -0,0 +1,198 @@
+---
+title: Construye una piscina de lotería sin pérdidas
+description: Aprende cómo crear un fondo de lotería sin pérdidas que aprovecha el rendimiento del stacking.
+---
+import { Code, Terminal } from 'lucide-react';
+
+Un contrato de lotería sin pérdidas ofrece una forma única para que los participantes acumulen sus activos y potencialmente ganen una recompensa mayor sin el riesgo de perder su depósito inicial.
+
+Este contrato garantiza que los participantes puedan apilar sus activos en un fondo generador de rendimientos, recibir un boleto NFT y tener la oportunidad de ganar recompensas adicionales mientras conservan su inversión original.
+
+En esta guía, aprenderás cómo:
+
+1. Definir constantes y variables de datos
+2. Crear y gestionar participantes y entradas
+3. Implementar la funcionalidad de la lotería
+4. Manejar la selección de ganadores
+5. Reclamar y distribuir recompensas
+
+:::callout
+### Nota
+
+Este ejemplo utiliza el protocolo CityCoins para el mecanismo de rendimiento de stacking, pero también se puede utilizar un pool de Stacking usando Proof of Transfer (PoX4).
+:::
+
+***
+
+## Definir constantes y variables de datos
+
+Primero, define algunas constantes y variables de datos para gestionar el estado de tu contrato. Las constantes se utilizan para valores fijos, y las variables de datos almacenan el estado que puede cambiar durante la ejecución del contrato.
+
+```clarity
+(define-constant OWNER tx-sender)
+(define-constant ERR_UNAUTHORIZED (err u101000))
+
+(define-data-var lotteryPool uint u0)
+(define-data-var totalYield uint u0)
+(define-data-var ticketCounter uint u0)
+```
+
+El `OWNER` constant define al propietario del contrato con privilegios administrativos, mientras que `ERR_UNAUTHORIZED` maneja intentos de acceso no autorizados.
+
+Las variables de datos clave incluyen `lotteryPool` para el seguimiento de activos apilados, `totalYield` para ganancias acumuladas, y `ticketCounter` para gestionar los tickets emitidos.
+
+## Crear y gestionar participantes y entradas
+
+A continuación, define un NFT para representar un boleto y un mapa para almacenar la información de los participantes.
+
+```clarity
+(define-map Participants
+ { participant: principal }
+ { ticketId: uint, amount: uint, cycle: uint, ticketExpirationAtCycle: uint, isWinner: bool }
+)
+
+(define-map Tickets
+ { ticketId: uint }
+ { owner: principal }
+)
+
+(define-non-fungible-token LotteryTicket uint)
+```
+
+El `Participants` map vincula a los participantes con los detalles de sus boletos, mientras que el `Tickets` el mapa asocia los boletos con sus propietarios.
+
+El `LotteryTicket` define un NFT para los boletos de lotería, crucial para gestionar las entradas.
+
+## Implementar la funcionalidad de la lotería
+
+Ahora, es momento de implementar la función principal del contrato, donde los participantes pueden entrar en la lotería depositando sus activos.
+
+```clarity
+(define-public (roll-the-dice (cityName (string-ascii 10)) (amount uint) (lockPeriod (optional uint)))
+ (let
+ (
+ (ticketId (+ (var-get ticketCounter) u1))
+ (actualLockPeriod (default-to u1 lockPeriod))
+ (rewardCycle (+ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking get-current-reward-cycle) u1))
+ )
+
+ (begin
+ (try! (contract-call? 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 transfer amount tx-sender (as-contract tx-sender) none))
+ (try! (nft-mint? LotteryTicket ticketId tx-sender))
+ (map-insert Participants { participant: tx-sender } { ticketId: ticketId, amount: amount, cycle: rewardCycle, ticketExpirationAtCycle: (+ rewardCycle actualLockPeriod), isWinner: false })
+ (map-set Tickets { ticketId: ticketId } { owner: tx-sender })
+ (var-set lotteryPool (+ (var-get lotteryPool) amount))
+ (var-set ticketCounter (+ (var-get ticketCounter) u1))
+ (ok ticketId)
+ )
+ )
+)
+```
+
+El `roll-the-dice` function permite a los participantes unirse a la lotería depositando activos, especificando la ciudad (`cityName`), el monto del depósito (`amount`), y el período de bloqueo (`lockPeriod`).
+
+Esta función es crucial para gestionar las participaciones en la lotería y garantizar que los activos estén correctamente bloqueados durante el período especificado.
+
+Cuando un participante llama a esta función, ocurren los siguientes pasos:
+
+1. **Generar ticket y determinar período de bloqueo**: Se genera un nuevo ID de ticket y se establece el período de bloqueo (por defecto es 1 si no se especifica).
+2. **Transferir activos y acuñar boleto NFT**: La cantidad especificada de activos se transfiere del participante al contrato, y se acuña un NFT que representa el boleto de lotería y se asigna al participante.
+3. **Actualizar datos de participantes y boletos**: La información del participante, incluyendo el ID del boleto, la cantidad, el ciclo y la fecha de vencimiento, se almacena, y se actualiza la información de propiedad del boleto.
+4. **Actualizar el fondo de lotería y devolver el ID del boleto**: La cantidad total en el pozo de la lotería se actualiza, el contador de boletos se incrementa y la función devuelve el ID del boleto recién generado al participante.
+
+Este proceso simplificado garantiza que la participación de cada concursante se registre correctamente y que sus activos se gestionen de forma segura dentro del sistema de lotería.
+
+## Manejo de la selección de ganadores
+
+Ahora, implementa la función para seleccionar un ganador aleatoriamente de entre los participantes.
+
+```clarity
+(define-private (select-winner)
+ (match (contract-call? 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2 get-save-rnd (- block-height u1)) randomTicketNumber
+ (let
+ (
+ (ticketCount (var-get ticketCounter))
+ (winningTicketId (mod randomTicketNumber ticketCount))
+ (winner (unwrap! (get-ticket winningTicketId) (err u404)))
+ (owner (get owner winner))
+ (participant (unwrap! (get-participant owner) (err u404)))
+ )
+ (map-set Participants { participant: owner }
+ { ticketId: winningTicketId, amount: (get amount participant), cycle: (get cycle participant), ticketExpirationAtCycle: (get ticketExpirationAtCycle participant), isWinner: true })
+ (ok owner)
+ )
+ selectionError (err selectionError)
+ )
+)
+```
+
+El `select-winner` function selecciona aleatoriamente un ganador utilizando un número del contrato VRF (`get-save-rnd`) y actualiza su estado con `unwrap!`. Esto garantiza un proceso justo y transparente de selección del ganador.
+
+Cuando se llama a esta función, ocurren los siguientes pasos:
+
+1. **Obtener número aleatorio**: Se obtiene un número aleatorio del contrato VRF mediante una llamada `get-save-rnd` con la altura del bloque anterior.
+2. **Determinar el boleto ganador**: El ID del boleto ganador se calcula tomando el módulo del número aleatorio con el número total de boletos (`ticketCounter`).
+3. **Recuperar información del ganador**: Se recuperan el boleto ganador y la información del participante utilizando el ID de boleto calculado.
+4. **Actualizar estado del ganador**: El estado del participante se actualiza para indicar que es un ganador estableciendo `isWinner` a `true` en el `Participants` mapa.
+
+Este proceso garantiza que el ganador sea seleccionado de manera justa y que su estado se actualice con precisión en el sistema.
+
+## Reclamar y distribuir recompensas
+
+Por último, implementa la función para reclamar y distribuir recompensas a los ganadores.
+
+```clarity
+(define-public (claim-rewards (cityName (string-ascii 10)) (cycle uint))
+ (let
+ (
+ (cityId (unwrap-panic (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-city-id cityName)))
+ (cycleAmount (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking get-balance-stx))
+ )
+ (if (is-eq cityName "mia")
+ (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-mia cycle cycleAmount))
+ (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-nyc cycle cycleAmount))
+ )
+ (as-contract (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking claim-stacking-reward cityName cycle))
+ )
+)
+
+(define-public (distribute-rewards)
+ (select-winner)
+)
+```
+
+El `claim-rewards` function permite a los participantes reclamar sus recompensas de staking, mientras que la `distribute-rewards` llamadas a funciones `select-winner` para seleccionar y recompensar aleatoriamente a los ganadores, asegurando un proceso de distribución justo.
+
+Cuando el `claim-rewards` La función es llamada, ocurren los siguientes pasos:
+
+1. **Obtener ID de ciudad y saldo**: El ID de la ciudad se obtiene utilizando el `get-city-id` función, y el saldo para el ciclo especificado se obtiene del contrato de tesorería.
+2. **Enviar recompensas de staking**: Dependiendo de la ciudad (`mia` o `nyc`), se llama a la función de recompensa de staking apropiada para enviar las recompensas del ciclo especificado.
+3. **Reclamar recompensa acumulada**: El contrato reclama la recompensa de stacking para la ciudad y ciclo especificados.
+
+Cuando el `distribute-rewards` La función es llamada, realiza el siguiente paso:
+
+1. **Seleccionar ganador**: El `select-winner` Se llama a la función para seleccionar aleatoriamente un ganador entre los participantes y actualizar su estado.
+
+Este proceso garantiza que los participantes puedan reclamar sus recompensas y que los ganadores sean seleccionados y premiados de manera justa.
+
+## Probando el contrato
+
+Para probar los contratos, siga los siguientes pasos dentro de `clarinet console`:
+
+```terminal
+$ ::advance_chain_tip 700000
+$ ::set_tx_sender
+$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool roll-the-dice "mia" u500 none)
+$ ::advance_chain_tip 2000
+$ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking deposit-stx u5000000000)
+$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool claim "mia" u17)
+```
+
+Para iniciar los contratos de CityCoins, sigue estos pasos:
+
+```clarity
+(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id "mia")
+(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id "nyc")
+(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)
+(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-nyc-stacking set-allowed 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2 true)
+```
diff --git a/content/docs/es/resources/guides/rate-limits.mdx b/content/docs/es/resources/guides/rate-limits.mdx
new file mode 100644
index 000000000..5d769a8f4
--- /dev/null
+++ b/content/docs/es/resources/guides/rate-limits.mdx
@@ -0,0 +1,36 @@
+---
+title: Limitación de velocidad
+description: Comprenda los límites de tasa para las API de Hiro y el Faucet de STX.
+---
+## Límites de tasa de la API
+
+Los siguientes límites de tasa (en solicitudes por minuto, o RPM) son aplicables para [todas las APIs de Hiro](https://www.hiro.so/blog/updated-rate-limits-for-hiro-apis):
+
+| Clave de API | Límite de tasa |
+|:-------------|:----------------------------------|
+| No | 50 solicitudes por minuto (RPM) por IP de cliente, para tráfico no autenticado |
+| Sí | 500 solicitudes por minuto (RPM), independientemente de la IP de origen, con una clave de API autenticada |
+
+Los límites de tasa se dividen entre dos tipos de servicio según la ruta de la API:
+
+* **Servicios de Bitcoin** (`/ordinals/*` y `/runes/*` caminos): [API de Ordinales](/apis/ordinals-api) y [API de Runas](/apis/runes-api)
+* **Servicios de Stacks** (todos los demás caminos): [API de Blockchain de Stacks](/apis/stacks-blockchain-api), [API de Metadatos de Tokens](/apis/token-metadata-api), [API de métricas de firmantes](/apis/signer-metrics-api), puntos finales de Explorer y otros servicios de Hiro
+
+Cada tipo de servicio tiene su propia cuota independiente, lo que te permite utilizar tanto las APIs de Stacks como las de Bitcoin sin que una afecte los límites de velocidad de la otra. Para más detalles, consulta nuestra guía sobre [encabezados de respuesta](/resources/guides/response-headers).
+
+:::callout
+Los servicios de plataforma (API de plataforma, Devnet) tienen límites de velocidad separados y no forman parte de este sistema de cuotas.
+:::
+
+:::callout
+Puedes crear una clave de API gratis en el [Plataforma Hiro](https://platform.hiro.so) creando una cuenta.
+:::
+
+## Límites de tasa del grifo STX
+
+Nota: este faucet es para la red de pruebas de Stacks y proporciona STX de prueba, que no tiene valor monetario.
+
+| Tipo | Límite de tasa |
+|:-----------------------------|:-----------------------------|
+| Solicitudes de stacking | 1 solicitud cada 2 días |
+| Solicitudes STX regulares | 1 solicitud por minuto (RPM) |
diff --git a/content/docs/es/resources/guides/response-headers.mdx b/content/docs/es/resources/guides/response-headers.mdx
new file mode 100644
index 000000000..e653c5472
--- /dev/null
+++ b/content/docs/es/resources/guides/response-headers.mdx
@@ -0,0 +1,115 @@
+---
+title: Encabezados de respuesta
+description: Comprendiendo la información de límite de tasa y cuota en los encabezados de respuesta de API.
+---
+Todas las API de Hiro devuelven encabezados de respuesta que proporcionan información importante sobre límites de tasa y cuotas de uso. Estos encabezados están separados por tipo de servicio (Stacks vs Bitcoin) para proporcionar un control más detallado sobre el uso de la API.
+
+Los siguientes encabezados se devuelven con cada respuesta de la API:
+
+```terminal
+$ curl -I https://api.hiro.so/extended/v1/info -H 'x-api-key: your-api-key'
+```
+
+| Encabezado | Descripción |
+|:----------|:-------------|
+| `ratelimit-limit` | El límite máximo de tasa para ese punto de conexión |
+| `ratelimit-remaining` | El número de solicitudes restantes para la ventana actual |
+| `ratelimit-reset` | El momento en que se reinicia la ventana del límite de tasa (marca de tiempo Unix) |
+| `retry-after` | Tiempo de espera antes de volver a intentar (solo presente cuando se limita la tasa) |
+
+## Encabezados específicos del servicio
+
+Las API de Hiro incluyen encabezados adicionales que proporcionan información detallada sobre los límites de tasa por tipo de servicio, reflejando la separación de los límites de tasa entre los servicios de Stacks y Bitcoin.
+
+### Encabezados de servicio de Stacks
+
+Al llamar a los endpoints relacionados con Stacks (API de Blockchain de Stacks, API de Metadatos de Tokens, etc.), recibirás:
+
+```typescript -c
+// Example: Fetching Stacks account info
+const response = await fetch('https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/assets', {
+ headers: { 'x-api-key': apiKey }
+});
+
+console.log(response)
+
+// New headers in response:
+// x-ratelimit-cost-stacks: 1 // !mark
+// x-ratelimit-limit-stacks-minute: 500
+// x-ratelimit-remaining-stacks-minute: 499
+```
+
+| Encabezado | Descripción |
+|:----------|:-------------|
+| `x-ratelimit-cost-stacks` | El costo de cuota para esta solicitud específica |
+| `x-ratelimit-limit-stacks-second` | Límite por segundo para servicios de Stacks |
+| `x-ratelimit-remaining-stacks-second` | Solicitudes restantes este segundo |
+| `x-ratelimit-limit-stacks-minute` | Límite por minuto para servicios de Stacks |
+| `x-ratelimit-remaining-stacks-minute` | Solicitudes restantes este minuto |
+| `x-ratelimit-limit-stacks-month` | Límite mensual para servicios de Stacks |
+| `x-ratelimit-remaining-stacks-month` | Solicitudes restantes este mes |
+
+### Encabezados de servicio de Bitcoin
+
+Al llamar a los endpoints relacionados con Bitcoin (API de Ordinales, API de Runas), recibirás:
+
+```typescript
+// Example: Fetching inscription data
+const response = await fetch('https://api.hiro.so/ordinals/v1/inscriptions', {
+ headers: { 'x-api-key': apiKey }
+});
+
+console.log(response)
+
+// New headers in response:
+// x-ratelimit-cost-bitcoin: 1
+// x-ratelimit-limit-bitcoin-minute: 500
+// x-ratelimit-remaining-bitcoin-minute: 499
+```
+
+| Encabezado | Descripción |
+|:----------|:-------------|
+| `x-ratelimit-cost-bitcoin` | El costo de cuota para esta solicitud específica |
+| `x-ratelimit-limit-bitcoin-second` | Límite por segundo para servicios de Bitcoin |
+| `x-ratelimit-remaining-bitcoin-second` | Solicitudes restantes este segundo |
+| `x-ratelimit-limit-bitcoin-minute` | Límite por minuto para servicios de Bitcoin |
+| `x-ratelimit-remaining-bitcoin-minute` | Solicitudes restantes este minuto |
+| `x-ratelimit-limit-bitcoin-month` | Límite mensual para servicios de Bitcoin |
+| `x-ratelimit-remaining-bitcoin-month` | Solicitudes restantes este mes |
+
+## Cronología de migración
+
+Para garantizar una transición sin problemas, estamos manteniendo la compatibilidad con versiones anteriores:
+
+* **1 de agosto de 2024**: Se introducen nuevos encabezados junto con los encabezados existentes
+* **1 de septiembre de 2024**: Los encabezados heredados serán obsoletos y eliminados
+
+### Encabezados heredados (obsoletos)
+
+Los siguientes encabezados se eliminarán el 1 de septiembre de 2024:
+
+* `x-ratelimit-limit-second`
+* `x-ratelimit-limit-minute`
+* `x-ratelimit-limit-month`
+* `x-ratelimit-remaining-second`
+* `x-ratelimit-remaining-minute`
+* `x-ratelimit-remaining-month`
+
+## Clasificación de servicios
+
+Las API se clasifican en tipos de servicio según su ruta URL:
+
+| Tipo de Servicio | Patrón de Ruta | Ejemplos |
+|:-------------|:-------------|:---------|
+| Bitcoin | `/ordinals/*` | Puntos finales de la API de Ordinales |
+| Bitcoin | `/runes/*` | Puntos finales de la API de Runas |
+| Stacks | Todas las demás rutas | API de Blockchain de Stacks, API de Metadatos de Tokens, API de Métricas de Firmante, Explorador y otros servicios |
+
+:::callout
+El `x-ratelimit-cost-*` El encabezado muestra el costo exacto de cuota para cada solicitud, que puede variar según el punto final y los parámetros utilizados. Los servicios de plataforma (API de plataforma, Devnet) tienen limitación de velocidad separada.
+:::
+
+## Lecturas adicionales
+
+* [Limitación de velocidad](/resources/guides/rate-limits)
+* [Claves de API](/resources/guides/api-keys)
diff --git a/content/docs/es/resources/guides/sync-a-bitcoin-node.mdx b/content/docs/es/resources/guides/sync-a-bitcoin-node.mdx
new file mode 100644
index 000000000..50888bccf
--- /dev/null
+++ b/content/docs/es/resources/guides/sync-a-bitcoin-node.mdx
@@ -0,0 +1,147 @@
+---
+title: Cómo sincronizar un nodo de Bitcoin
+description: Aprende cómo sincronizar un nodo de Bitcoin para construir aplicaciones de Bitcoin.
+---
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+
+Sincronizar un nodo de Bitcoin es a menudo uno de los primeros pasos que da un desarrollador cuando construye una aplicación de Bitcoin. Es una gran introducción al ecosistema de desarrolladores de Bitcoin, y si dependes de datos en cadena, no hay forma más segura de obtener esos datos que haciéndolo tú mismo.
+
+En esta guía, aprenderás cómo:
+
+1. Descargue el daemon de Bitcoin Core en su máquina
+2. Configurar `bitcoind`
+3. Comience a sincronizar su nodo
+4. Apague y reinicie correctamente su nodo
+
+:::callout
+type: warn
+
+### Requisitos
+
+Para comenzar, primero necesitamos descargar `bitcoind`En nuestro ejemplo, usaremos la versión 25.0. Puedes seleccionar una versión de software compatible con tu dispositivo [de esta lista](https://bitcoincore.org/bin/bitcoin-core-25.0).
+:::
+
+***
+
+## Configurar `bitcoind`
+
+Una vez que tu descarga esté completa, toma nota de tu ruta hacia el `bitcoind` ejecutable.
+
+:::callout
+### Nota
+
+Cuando sincronices tu nodo, estaremos ejecutando el programa en `/bitcoin-25.0/bin/bitcoin`, que es donde el `bitcoind` el ejecutable está ubicado.
+:::
+
+A continuación, un par de pasos de configuración.
+
+1. Seleccione o cree un directorio para almacenar sus datos de Bitcoin.
+2. Actualiza el `bitcoin.conf` archivo para incluir la ruta a tu directorio de datos de Bitcoin.
+
+El chainstate de Bitcoin es bastante grande, y necesitas un lugar para almacenarlo. En este ejemplo, vamos a configurar un directorio llamado `bitcoin-data` en una unidad de disco duro externa que hemos montado en `/Volumes/SSD`.
+
+:::callout
+### Nota
+
+Esta carpeta, `bitcoin-data`, puede nombrarse como desee y puede existir localmente o en un disco duro externo.
+
+Lo más importante es que debe existir en un lugar que tenga suficiente almacenamiento para contener todos los datos de Bitcoin que recibiremos una vez que comience a sincronizarse.
+:::
+
+Ahora navega a tu `bitcoin.conf` archivo, que se encuentra en tu `/path/to/bitcoin` directorio y actualizar el `datadir` campo con tu directorio.
+
+En este ejemplo, se vería así:
+
+```bash bitcoin.conf
+datadir=/Volumes/SSD/bitcoin-data/
+```
+
+
+
+ Puede anular la configuración predeterminada con lo siguiente, incluyendo la ruta donde almacenará todos los datos de Bitcoin una vez que comience la sincronización:
+
+ ```bash
+ datadir=/your-path-to/bitcoin-data/
+ server=1
+ rpcuser=devnet
+ rpcpassword=devnet
+ rpcport=8332
+ rpcallowip=0.0.0.0/0
+ rpcallowip=::/0
+ txindex=1
+ listen=1
+ discover=0
+ dns=0
+ dnsseed=0
+ listenonion=0
+ rpcserialversion=1
+ disablewallet=0
+ fallbackfee=0.00001
+ rpcthreads=8
+ blocksonly=1
+ dbcache=4096
+
+ # Start zeromq
+ zmqpubhashblock=tcp://0.0.0.0:18543
+ ```
+
+
+
+Si planeas usar tu nodo para recibir transacciones, deberás tomar nota del `username` y `password` campos para tu nodo.
+
+:::callout
+### Nota
+
+En el ejemplo `bitcoin.conf` encima, `devnet` figura como el predeterminado `username` y `password`.
+:::
+
+## Ejecute el nodo
+
+Con un terminado `bitcoin.conf` archivo, es hora de iniciar tu nodo.
+
+Esto toma la forma de `path/to/bitcoind -conf=path/to/bitcoin.conf`, que en este ejemplo se ve así:
+
+```terminal
+$ /Volumes/SSD/bitcoin-25.0/bin/bitcoind -conf=/Volumes/SSD/bitcoin-25.0/bitcoin.conf
+```
+
+Después de ejecutar este comando, verás `zmq_url` entradas en la salida estándar de tu consola, mostrando los registros de ZeroMQ de tu nodo de Bitcoin. ¡Felicidades! ¡Ahora estás sincronizando!
+
+:::callout
+### Nota
+
+Puede tardar desde unas pocas horas hasta varios días en ejecutarse y sincronizarse completamente, dependiendo de si es la primera vez que sincroniza un nodo.
+:::
+
+## Procedimiento adecuado de apagado y reinicio
+
+1. Apagando su nodo
+2. Reiniciando tu nodo
+
+Para apagar tu nodo de forma segura, utiliza el `bitcoin-cli` ejecutable, ubicado dentro del `bin` directorio, y ejecuta el `stop` comando:
+
+```terminal
+$ /path/to/bitcoin-cli \
+ --conf=/path/to/bitcoin.conf \
+ --rpcuser={{your-rpc-username}} \
+ --rpcpassword={{your-rpc-password}} stop
+```
+
+Para volver a iniciar tu nodo, todo lo que necesitas hacer es consultar los pasos anteriores mencionados arriba ejecutando `path/to/bitcoind -conf=path/to/bitcoin.conf`.
+
+:::callout
+### Cómo expulsar un disco duro externo
+
+
+
+ 1. Ve al Finder, luego a la barra lateral, y selecciona el disco que quieres expulsar bajo "Dispositivos". Haz clic en el icono de expulsión junto al nombre.
+ 2. Espere un mensaje de confirmación que indique que es seguro expulsar el dispositivo antes de desconectar la unidad.
+
+
+
+ 1. Abra el Explorador de archivos, seleccione la unidad de la lista bajo "Este equipo" (PC > Dispositivos y unidades), y haga clic en el botón "Expulsar".
+ 2. Espere un mensaje de confirmación que indique que es seguro expulsar el dispositivo antes de desconectar la unidad.
+
+
+:::
diff --git a/content/docs/es/resources/guides/sync-a-stacks-node.mdx b/content/docs/es/resources/guides/sync-a-stacks-node.mdx
new file mode 100644
index 000000000..da390a926
--- /dev/null
+++ b/content/docs/es/resources/guides/sync-a-stacks-node.mdx
@@ -0,0 +1,47 @@
+---
+title: Cómo sincronizar un nodo de Stacks
+description: Aprende cómo sincronizar un nodo de Stacks para ejecutar una devnet local o mainnet.
+---
+Ejecutar un nodo de Stacks es crucial para los desarrolladores que buscan interactuar directamente con la cadena de bloques de Stacks. Permite la verificación de transacciones, garantiza operaciones descentralizadas y mejora la seguridad de la cadena de bloques.
+
+## Lo que aprenderás
+
+:::objectives
+* Clonar el repositorio Docker de la cadena de bloques Stacks
+* Iniciar el servicio
+* Monitorear el proceso de sincronización del nodo
+:::
+
+## Clonar el repositorio Docker de la cadena de bloques Stacks
+
+Clona el repositorio Docker de la blockchain Stacks desde GitHub:
+
+```terminal
+$ git clone git@github.com:hirosystems/stacks-blockchain-docker.git
+$ cd stacks-blockchain-docker
+```
+
+## Iniciar el servicio
+
+Dentro de `stacks-blockchain-docker` directorio, ejecute el siguiente comando para iniciar el nodo de Stacks:
+
+```terminal
+$ chmod +x manage.sh
+$ ./manage.sh -n -a start
+```
+
+El `` Los marcadores de posición utilizados a continuación pueden ser reemplazados por uno de:
+
+* `mainnet`
+* `testnet`
+* `mocknet`
+
+## Monitorear el proceso de sincronización del nodo
+
+Para seguir los registros del nodo de Stacks, ejecute el siguiente comando:
+
+```terminal
+$ ./manage.sh -n -a logs
+```
+
+Para redes distintas a `mocknet`, la descarga de los encabezados iniciales puede tardar varios minutos. Hasta que se descarguen los encabezados, el `/v2/info` los endpoints no devolverán ningún dato.
diff --git a/content/docs/es/resources/guides/using-clarity-values.mdx b/content/docs/es/resources/guides/using-clarity-values.mdx
new file mode 100644
index 000000000..33e5b5a57
--- /dev/null
+++ b/content/docs/es/resources/guides/using-clarity-values.mdx
@@ -0,0 +1,53 @@
+---
+title: Uso de los valores de Clarity
+description: Aprende cómo usar los valores de Clarity en tus contratos inteligentes de Clarity.
+---
+Algunos endpoints, como el [llamada a función de contrato de solo lectura](https://docs.hiro.so/api#operation/call_read_only_function), requiere entrada a un serializado [Valor de claridad](https://docs.stacks.co/docs/clarity/). Otros endpoints devuelven valores serializados que necesitan ser deserializados.
+
+El ejemplo que se muestra a continuación ilustra el uso del valor de Clarity en combinación con la API.
+
+El `@stacks/transactions` la biblioteca admite llamadas a contratos tipificadas y facilita [utilización del valor de respuesta mucho más simple](https://docs.stacks.co/docs/clarity/).
+
+## Ejemplo de uso
+
+```ts
+import {
+ Configuration,
+ SmartContractsApiInterface,
+ SmartContractsApi,
+ ReadOnlyFunctionSuccessResponse,
+} from '@stacks/blockchain-api-client';
+import { uintCV, UIntCV, cvToHex, hexToCV, ClarityType } from '@stacks/transactions';
+
+(async () => {
+ const apiConfig: Configuration = new Configuration({
+ fetchApi: fetch,
+ // for mainnet, replace `testnet` with `mainnet`
+ basePath: 'https://api.testnet.hiro.so', // defaults to http://localhost:3999
+ });
+
+ const contractsApi: SmartContractsApiInterface = new SmartContractsApi(apiConfig);
+
+ const principal: string = 'ST000000000000000000002AMW42H';
+
+ // use most recent from: https://api..hiro.so/v2/pox
+ const rewardCycle: UIntCV = uintCV(22);
+
+ // call a read-only function
+ const fnCall: ReadOnlyFunctionSuccessResponse = await contractsApi.callReadOnlyFunction({
+ contractAddress: principal,
+ contractName: 'pox',
+ functionName: 'is-pox-active',
+ readOnlyFunctionArgs: {
+ sender: principal,
+ arguments: [cvToHex(rewardCycle)],
+ },
+ });
+
+ console.log({
+ status: fnCall.okay,
+ result: fnCall.result,
+ representation: hexToCV(fnCall.result).type === ClarityType.BoolTrue,
+ });
+})().catch(console.error);
+```
diff --git a/content/docs/es/resources/guides/using-pyth-price-feeds.mdx b/content/docs/es/resources/guides/using-pyth-price-feeds.mdx
new file mode 100644
index 000000000..272dfb4fb
--- /dev/null
+++ b/content/docs/es/resources/guides/using-pyth-price-feeds.mdx
@@ -0,0 +1,426 @@
+---
+title: Uso de fuentes de precios de Pyth
+description: Guía completa para integrar datos de precios de mercado en tiempo real de Pyth Network en sus aplicaciones de Stacks.
+---
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+import { Steps, Step } from '@/components/steps';
+import { ArrowRight, Check } from 'lucide-react';
+
+## Visión general
+
+Esta guía completa le guía a través de la integración [Red Pyth](https://pyth.network)'s oráculo descentralizado para datos de precios en tiempo real en tus aplicaciones de Stacks. Construiremos un ejemplo completo: un NFT que solo se puede acuñar pagando exactamente $100 en valor de sBTC.
+
+:::callout
+The Pyth protocol integration is available as a Beta on both testnet and mainnet networks. It's maintained by Trust Machines and provides access to real-time price feeds for BTC, STX, ETH, and USDC.
+:::
+
+## Descripción general de la arquitectura
+
+Pyth Network utiliza una única **basado en pull** diseño de oráculo:
+
+
+
+A diferencia de los oráculos basados en push que actualizan continuamente los precios en la cadena, Pyth permite a los usuarios obtener y enviar actualizaciones de precios solo cuando es necesario, lo que lo hace más eficiente en términos de gas.
+
+## Lo que estamos construyendo
+
+Crearemos un "Benjamin Club" - un NFT exclusivo que cuesta exactamente $100 en valor de sBTC para acuñar. Esto demuestra:
+
+* Lectura de precios BTC/USD en tiempo real desde Pyth
+* Conversión entre cantidades de USD y criptomonedas
+* Manejo de aritmética de punto fijo
+* Construyendo una integración frontend completa
+* Probando contratos dependientes de oráculo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Pasos de implementación
+
+
+
+ ### Escribir el contrato inteligente
+
+ Primero, implemente el contrato de Clarity que lee los datos de precios de Pyth:
+
+ ```clarity contracts/benjamin-club.clar
+ ;; Benjamin Club - $100 NFT minting contract
+ (define-constant CONTRACT-OWNER tx-sender)
+ (define-constant BENJAMIN-COST u100) ;; $100 USD
+ (define-constant ERR-INSUFFICIENT-FUNDS (err u100))
+ (define-constant ERR-PRICE-UPDATE-FAILED (err u101))
+ (define-constant ERR-STALE-PRICE (err u102))
+
+ ;; Pyth oracle contracts
+ (define-constant PYTH-ORACLE 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3)
+ (define-constant PYTH-STORAGE 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3)
+ (define-constant PYTH-DECODER 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-pnau-decoder-v2)
+ (define-constant WORMHOLE-CORE 'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.wormhole-core-v3)
+
+ ;; BTC price feed ID
+ (define-constant BTC-USD-FEED-ID 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43)
+
+ ;; NFT definition
+ (define-non-fungible-token benjamin-nft uint)
+ (define-data-var last-token-id uint u0)
+
+ (define-public (mint-for-hundred-dollars (price-feed-bytes (buff 8192)))
+ (let (
+ ;; Update price feed with fresh VAA data
+ (update-result (try! (contract-call? PYTH-ORACLE
+ verify-and-update-price-feeds price-feed-bytes {
+ pyth-storage-contract: PYTH-STORAGE,
+ pyth-decoder-contract: PYTH-DECODER,
+ wormhole-core-contract: WORMHOLE-CORE
+ })))
+
+ ;; Get the updated BTC price
+ (price-data (try! (contract-call? PYTH-ORACLE
+ get-price BTC-USD-FEED-ID PYTH-STORAGE)))
+
+ ;; Process the price data
+ (btc-price (process-price-data price-data))
+
+ ;; Calculate required sBTC amount for $100
+ (required-sbtc (calculate-sbtc-amount btc-price))
+
+ ;; Get user's sBTC balance
+ (user-balance (unwrap!
+ (contract-call? .sbtc-token get-balance tx-sender)
+ ERR-INSUFFICIENT-FUNDS))
+ )
+ ;; Verify price is fresh (less than 5 minutes old)
+ (try! (verify-price-freshness price-data))
+
+ ;; Verify user has enough sBTC
+ (asserts! (>= user-balance required-sbtc) ERR-INSUFFICIENT-FUNDS)
+
+ ;; Transfer sBTC from user
+ (try! (contract-call? .sbtc-token transfer
+ required-sbtc tx-sender (as-contract tx-sender) none))
+
+ ;; Mint the NFT
+ (let ((token-id (+ (var-get last-token-id) u1)))
+ (try! (nft-mint? benjamin-nft token-id tx-sender))
+ (var-set last-token-id token-id)
+ (ok { token-id: token-id, price-paid: required-sbtc }))
+ )
+ )
+
+ (define-private (process-price-data (price-data {
+ price-identifier: (buff 32),
+ price: int,
+ conf: uint,
+ expo: int,
+ ema-price: int,
+ ema-conf: uint,
+ publish-time: uint,
+ prev-publish-time: uint
+ }))
+ (let (
+ ;; Convert fixed-point to regular number
+ ;; For expo = -8, divide by 10^8
+ (denominator (pow u10 (to-uint (* (get expo price-data) -1))))
+ (price-uint (to-uint (get price price-data)))
+ )
+ (/ price-uint denominator)
+ )
+ )
+
+ (define-private (calculate-sbtc-amount (btc-price-usd uint))
+ ;; $100 in sats = (100 * 10^8) / btc-price-usd
+ (/ (* BENJAMIN-COST u100000000) btc-price-usd)
+ )
+
+ (define-private (verify-price-freshness (price-data (tuple)))
+ (let (
+ (current-time (unwrap-panic (get-block-info? time block-height)))
+ (publish-time (get publish-time price-data))
+ (max-age u300) ;; 5 minutes
+ )
+ (if (<= (- current-time publish-time) max-age)
+ (ok true)
+ ERR-STALE-PRICE)
+ )
+ )
+ ```
+
+ Para una explicación detallada de los componentes del contrato, consulte nuestra [Guía de integración de Clarity](/resources/clarity/external-data).
+
+
+
+ ### Construir la integración del frontend
+
+ Crear un servicio para obtener datos de precios de Pyth:
+
+ ```typescript frontend/pyth-service.ts
+ import { PriceServiceConnection } from '@pythnetwork/price-service-client';
+ import { Buffer } from 'buffer';
+
+ const PRICE_FEEDS = {
+ BTC_USD: '0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43'
+ };
+
+ export async function fetchBTCPriceVAA(): Promise {
+ const pythClient = new PriceServiceConnection(
+ 'https://hermes.pyth.network',
+ { priceFeedRequestConfig: { binary: true } }
+ );
+
+ const vaas = await pythClient.getLatestVaas([PRICE_FEEDS.BTC_USD]);
+ const messageBuffer = Buffer.from(vaas[0], 'base64');
+
+ return `0x${messageBuffer.toString('hex')}`;
+ }
+ ```
+
+ Luego cree un componente de React para acuñar:
+
+ ```typescript frontend/MintButton.tsx
+ import { request } from '@stacks/connect';
+ import { Cl, Pc } from '@stacks/transactions';
+ import { fetchBTCPriceVAA } from './pyth-service';
+ import { useState } from 'react';
+
+ export function MintBenjaminNFT() {
+ const [loading, setLoading] = useState(false);
+
+ const handleMint = async () => {
+ setLoading(true);
+ try {
+ // Fetch fresh price data
+ const priceVAA = await fetchBTCPriceVAA();
+
+ // Create post-conditions for safety
+ const postConditions = [
+ // Oracle fee (1 uSTX max)
+ Pc.principal('SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R').willSendLte(1).ustx()
+ ];
+
+ // Call contract using request
+ const response = await request('stx_callContract', {
+ contract: 'SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R.benjamin-club',
+ functionName: 'mint-for-hundred-dollars',
+ functionArgs: [Cl.bufferFromHex(priceVAA.slice(2))],
+ postConditions,
+ postConditionMode: 'deny',
+ network: 'mainnet'
+ });
+
+ alert(`NFT minted! Transaction ID: ${response.txid}`);
+ } catch (error) {
+ console.error('Minting failed:', error);
+ alert('Failed to mint NFT');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+ {loading ? 'Fetching price...' : 'Mint Benjamin NFT ($100)'}
+
+ );
+ }
+ ```
+
+ Para obtener detalles completos sobre la integración del frontend, consulte nuestra [Guía de integración de Stacks.js](/reference/stacks.js/pyth-oracle-integration).
+
+
+
+ ### Prueba tu implementación
+
+ Escriba pruebas exhaustivas utilizando Clarinet:
+
+ ```typescript tests/benjamin-club.test.ts
+ import { describe, expect, it } from "vitest";
+ import { Cl } from '@stacks/transactions';
+
+ describe("Benjamin Club Tests", () => {
+ it("should calculate correct sBTC amount", () => {
+ // Set mock BTC price to $100,000
+ simnet.callPublicFn(
+ "mock-pyth-oracle",
+ "set-mock-price",
+ [
+ Cl.bufferFromHex(BTC_FEED_ID),
+ Cl.int(10000000000000), // $100,000 with 8 decimals
+ Cl.int(-8)
+ ],
+ deployer
+ );
+
+ // Test price calculation
+ const response = simnet.callReadOnlyFn(
+ "benjamin-club",
+ "get-required-sbtc-amount",
+ [],
+ wallet1
+ );
+
+ // $100 at $100k/BTC = 0.001 BTC = 100,000 sats
+ expect(response.result).toBeOk(Cl.uint(100000));
+ });
+ });
+ ```
+
+ Para estrategias avanzadas de pruebas, incluyendo simulación de mainnet, consulte nuestra [Guía de pruebas de Clarinet](/tools/clarinet/pyth-oracle-integration).
+
+
+
+## Mejores prácticas
+
+### Frescura del precio
+
+Siempre verifique que los datos de precios sean lo suficientemente recientes para su caso de uso:
+
+```clarity
+(define-constant MAX-PRICE-AGE u300) ;; 5 minutes
+
+(define-private (verify-price-freshness (price-data (tuple)))
+ (let ((age (- block-height (get publish-time price-data))))
+ (asserts! (<= age MAX-PRICE-AGE) ERR-STALE-PRICE)
+ (ok true)))
+```
+
+### Manejo de errores
+
+Implementar un manejo integral de errores para fallos del oráculo:
+
+```typescript
+try {
+ const vaa = await fetchBTCPriceVAA();
+ // Process VAA...
+} catch (error) {
+ if (error.message.includes('Network')) {
+ // Retry with exponential backoff
+ await retryWithBackoff(() => fetchBTCPriceVAA());
+ } else {
+ // Handle other errors
+ throw error;
+ }
+}
+```
+
+### Optimización de gas
+
+Agrupe múltiples actualizaciones de precios cuando sea posible:
+
+```clarity
+(define-public (update-multiple-prices
+ (btc-vaa (buff 8192))
+ (eth-vaa (buff 8192))
+ (stx-vaa (buff 8192)))
+ (let ((all-vaas (concat btc-vaa (concat eth-vaa stx-vaa))))
+ (contract-call? PYTH-ORACLE verify-and-update-price-feeds all-vaas params)))
+```
+
+## Solución de problemas
+
+### Problemas comunes
+
+
+
+ La verificación de VAA falla
+
+
+ Asegúrate de obtener datos VAA con `binary: true` opción y convirtiendo de base64 a hexadecimal correctamente. El VAA debe ser reciente (típicamente dentro de 5 minutos).
+
+
+
+
+ Los cálculos de precios son incorrectos
+
+
+ Verifica que estés manejando el exponente correctamente. Pyth utiliza una representación de punto fijo donde el precio real = precio\_bruto \* 10^exponente. Para exponentes negativos, divide por 10^(-exponente).
+
+
+
+
+ Se agota el gas de la transacción
+
+
+ Las actualizaciones del oráculo pueden consumir mucho gas. Asegúrese de que sus límites de gas tengan en cuenta tanto la actualización del oráculo como la lógica de su contrato. Considere almacenar en caché los precios cuando múltiples operaciones necesiten el mismo precio.
+
+
+
+
+## Consideraciones de seguridad
+
+1. **Manipulación de precios**: Utiliza siempre intervalos de confianza e implementa comprobaciones de cordura
+2. **Adelantamiento**: Considere utilizar esquemas de compromiso-revelación para operaciones sensibles al precio
+3. **Tarifas del oráculo**: Establecer condiciones posteriores apropiadas para limitar la exposición a tarifas
+4. **Obsolescencia**: Rechazar precios más antiguos que tu umbral de seguridad
+
+## Referencia rápida
+
+### Direcciones de contratos
+
+| Red | Contrato | Dirección |
+|---------|----------|---------|
+| Mainnet | pyth-oracle-v3 | `SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3` |
+| Mainnet | pyth-storage-v3 | `SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3` |
+| Red de pruebas | pyth-oracle-v3 | `ST3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3` |
+
+### IDs de fuentes de precios
+
+| Activo | ID del Feed |
+|-------|---------|
+| BTC/USD | `0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
+| STX/USD | `0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17` |
+| ETH/USD | `0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
+| USDC/USD | `0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
+
+## Recursos adicionales
+
+* [Documentación de Pyth Network](https://docs.pyth.network)
+* [Integración de Pyth en Trust Machines](https://github.com/Trust-Machines/stacks-pyth-bridge)
+* [Especificación VAA de Wormhole](https://wormhole.com/docs/protocol/infrastructure/vaas/)
+
+## Próximos pasos
+
+:::next-steps
+* [Inmersión profunda en Clarity](/resources/clarity/external-data): Patrones avanzados de oráculos y optimizaciones
+* [Inmersión profunda en el frontend](/reference/stacks.js/pyth-oracle-integration): Construyendo interfaces de usuario de oráculos listas para producción
+:::
diff --git a/content/docs/es/resources/snippets/build-a-stx-pc.mdx b/content/docs/es/resources/snippets/build-a-stx-pc.mdx
new file mode 100644
index 000000000..37a0ab4a8
--- /dev/null
+++ b/content/docs/es/resources/snippets/build-a-stx-pc.mdx
@@ -0,0 +1,47 @@
+---
+title: Construir una post-condición STX
+description: Una función auxiliar que crea una post-condición para transferencias de tokens STX utilizando la clase constructora Pc, asegurando que se transfieran las cantidades exactas según lo esperado.
+full: true
+---
+```typescript
+import {
+ AnchorMode,
+ broadcastTransaction,
+ makeSTXTokenTransfer,
+ Pc,
+ PostConditionMode,
+} from "@stacks/transactions";
+
+// Create a post-condition that ensures exactly 10 STX is sent
+const pc = Pc.principal("ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM")
+ .willSendEq(10000000) // 10 STX in micro-STX
+ .ustx();
+
+const txOptions = {
+ recipient: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5",
+ amount: 10000000,
+ senderKey: "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601",
+ network: "testnet",
+ postConditions: [pc],
+ postConditionMode: PostConditionMode.Deny,
+ anchorMode: AnchorMode.Any,
+};
+
+const transaction = await makeSTXTokenTransfer(txOptions);
+const broadcastResponse = await broadcastTransaction(transaction);
+console.log("Transaction ID:", broadcastResponse.txid);
+```
+
+## Casos de uso
+
+* Asegurando las transferencias de tokens STX con validación del monto de transferencia
+* Protegiendo a los usuarios de transferencias de tokens inesperadas
+* Asegurando que las interacciones del contrato se comporten como se espera
+
+## Conceptos clave
+
+El `Pc` builder proporciona una interfaz fluida para crear post-condiciones:
+
+* `Pc.principal()` - Especificar el principal que enviará los tokens
+* `.willSendEq()` - Asegúrate de que se envíe exactamente esta cantidad (también admite `willSendGte`, `willSendLte`, `willSendGt`, `willSendLt`)
+* `.ustx()` - Especificar el tipo de token (micro-STX)
diff --git a/content/docs/es/resources/snippets/build-an-ft-pc.mdx b/content/docs/es/resources/snippets/build-an-ft-pc.mdx
new file mode 100644
index 000000000..e2ed8a2ec
--- /dev/null
+++ b/content/docs/es/resources/snippets/build-an-ft-pc.mdx
@@ -0,0 +1,33 @@
+---
+title: Construir una post-condición FT
+description: Crear post-condiciones para transferencias de tokens fungibles para garantizar que se transfieran las cantidades exactas según lo esperado
+---
+```typescript
+import { Pc } from '@stacks/transactions';
+
+// Create a post-condition for fungible token transfers
+const postCondition = Pc.principal("ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM")
+ .willSendGte(500) // Amount in token's smallest unit
+ .ft("ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.token-ft", "my-token");
+
+// Use in transaction options
+const txOptions = {
+ // ... other transaction options
+ postConditions: [postCondition],
+ postConditionMode: PostConditionMode.Deny,
+};
+```
+
+## Casos de uso
+
+* Asegurando transferencias de tokens fungibles con validación de cantidad
+* Protegiendo a los usuarios de transferencias inesperadas de tokens en protocolos DeFi
+* Asegurando que los intercambios de tokens ocurran con las cantidades esperadas
+
+## Conceptos clave
+
+El `Pc` constructor para tokens fungibles acepta:
+
+* `.ft()` - Toma dos parámetros:
+ * Dirección del contrato con el nombre del activo (p. ej., `"contract.asset-name"`)
+ * Nombre del token según se define en el contrato
diff --git a/content/docs/es/resources/snippets/build-an-nft-pc.mdx b/content/docs/es/resources/snippets/build-an-nft-pc.mdx
new file mode 100644
index 000000000..9c85422a2
--- /dev/null
+++ b/content/docs/es/resources/snippets/build-an-nft-pc.mdx
@@ -0,0 +1,30 @@
+---
+title: Construir una post-condición NFT
+description: Crear condiciones posteriores para transferencias de NFT para garantizar que tokens específicos sean o no sean transferidos
+---
+```typescript
+import { Pc, Cl } from '@stacks/transactions';
+
+// Ensure a specific NFT will be sent
+const sendPC = Pc.principal("ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM")
+ .willSendAsset()
+ .nft('ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.cool-nfts::nft-token', Cl.uint(42));
+
+// Ensure a specific NFT will NOT be sent
+const keepPC = Pc.principal("ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM")
+ .willNotSendAsset()
+ .nft('ST1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE.cool-nfts::nft-token', Cl.uint(1));
+```
+
+## Casos de uso
+
+* Protegiendo NFTs valiosos de transferencias accidentales
+* Asegurando que NFTs específicos sean transferidos en transacciones de mercado
+* Protegiendo colecciones NFT durante interacciones con contratos
+
+## Conceptos clave
+
+Las post-condiciones de NFT utilizan el `.nft()` método que requiere:
+
+* **Identificador de activo**: Dirección del contrato + nombre del activo con `::` separator
+* **ID del token**: El ID específico del NFT como un valor de Clarity (usando `Cl.uint()`)
diff --git a/content/docs/es/resources/snippets/build-an-unsigned-tx.mdx b/content/docs/es/resources/snippets/build-an-unsigned-tx.mdx
new file mode 100644
index 000000000..a9f1ea8ab
--- /dev/null
+++ b/content/docs/es/resources/snippets/build-an-unsigned-tx.mdx
@@ -0,0 +1,50 @@
+---
+title: Construir una transacción sin firmar
+description: Crear transacciones sin firmar para billeteras de hardware o escenarios de firma múltiple
+---
+```typescript
+import { getPublicKeyFromPrivate } from "@stacks/encryption";
+import {
+ makeUnsignedSTXTokenTransfer,
+ makeUnsignedContractCall,
+ Cl,
+ AnchorMode,
+ PostConditionMode
+} from "@stacks/transactions";
+import { STACKS_TESTNET } from "@stacks/network";
+
+// Get public key from private key
+const privateKey = "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601";
+const publicKey = getPublicKeyFromPrivate(privateKey);
+
+// Build unsigned STX transfer
+const unsignedTx = await makeUnsignedSTXTokenTransfer({
+ recipient: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5",
+ amount: 1000000n, // 1 STX in micro-STX
+ fee: 200n,
+ nonce: 0n,
+ network: STACKS_TESTNET,
+ memo: "Test transfer",
+ publicKey,
+ anchorMode: AnchorMode.Any,
+ postConditionMode: PostConditionMode.Deny,
+});
+
+// Transaction is ready for external signing
+console.log("Unsigned transaction created:", unsignedTx.txid());
+```
+
+## Casos de uso
+
+* Integración de billetera hardware (Ledger, Trezor)
+* Transacciones de billetera multifirma
+* Firma de transacciones sin conexión
+* Sistemas de gestión de claves seguras
+
+## Conceptos clave
+
+Las transacciones sin firmar separan la creación de la transacción de la firma:
+
+* **Clave pública solamente**: No se necesita clave privada para la creación
+* **Firma externa**: Firmar con cartera de hardware o enclave seguro
+* **Serialización**: Se puede transportar y firmar en otro lugar
diff --git a/content/docs/es/resources/snippets/check-for-duplicates.mdx b/content/docs/es/resources/snippets/check-for-duplicates.mdx
new file mode 100644
index 000000000..8d60cc73d
--- /dev/null
+++ b/content/docs/es/resources/snippets/check-for-duplicates.mdx
@@ -0,0 +1,39 @@
+---
+title: Comprobar duplicados
+description: Detectar caracteres duplicados en cadenas y elementos duplicados en listas usando Clarity
+---
+```clarity
+;; Check for duplicate characters in a string
+(define-read-only (has-duplicate-chars? (input (string-ascii 200)))
+ (is-none (fold dup input (slice? (concat input "|END") u1 (+ (len input) u4))))
+)
+
+(define-private (dup (ch (string-ascii 1)) (out (optional (string-ascii 204))))
+ (match out out_some
+ (match (index-of? (unwrap-panic (slice? out_some u0 (- (len out_some) u4))) ch)
+ found none
+ (slice? out_some u1 (len out_some))
+ )
+ out
+ )
+)
+
+;; Example usage
+(has-duplicate-chars? "hello") ;; Returns true (duplicate 'l')
+(has-duplicate-chars? "world") ;; Returns false (no duplicates)
+```
+
+## Casos de uso
+
+* Validando nombres de usuario para la unicidad de caracteres
+* Verificando la singularidad de los rasgos de NFT en colecciones
+* Previniendo entradas duplicadas en sistemas de votación
+* Asegurando identificadores únicos en listas
+
+## Conceptos clave
+
+La detección de duplicados utiliza diferentes estrategias:
+
+* **Cadenas**: Usos `fold` con `index-of?` para encontrar caracteres repetidos
+* **Listas**: Comprueba si los elementos aparecen de nuevo en el resto de la lista
+* **Optimización**: Salida temprana en el primer duplicado encontrado
diff --git a/content/docs/es/resources/snippets/convert-btc-to-stx-address.mdx b/content/docs/es/resources/snippets/convert-btc-to-stx-address.mdx
new file mode 100644
index 000000000..6f335488e
--- /dev/null
+++ b/content/docs/es/resources/snippets/convert-btc-to-stx-address.mdx
@@ -0,0 +1,46 @@
+---
+title: Convertir dirección BTC a STX
+description: Convierte direcciones de Bitcoin a sus correspondientes direcciones de Stacks utilizando decodificación base58 en Clarity
+---
+```clarity
+(define-read-only (btc-to-stx (input (string-ascii 60)))
+ (let (
+ ;; Decode base58 string to numbers
+ (b58-numbers (map unwrap-uint (filter is-some-uint (map b58-to-uint input))))
+ ;; Validate all characters are valid base58
+ (t1 (asserts! (>= (len b58-numbers) (len input)) ERR_INVALID_CHAR))
+ ;; Count leading '1's (zeros in base58)
+ (leading-ones-count (default-to (len input) (index-of? (map is-zero b58-numbers) false)))
+ ;; Convert to bytes
+ (decoded (concat (fold decode-outer to-decode LST) leading-zeros))
+ (decoded-hex (fold to-hex-rev decoded 0x))
+ ;; Verify checksum
+ (actual-checksum (unwrap-panic (slice? (sha256 (sha256 (unwrap-panic (slice? decoded-hex u0 (- decoded-hex-len u4))))) u0 u4)))
+ (expected-checksum (unwrap-panic (slice? decoded-hex (- decoded-hex-len u4) decoded-hex-len)))
+ (t3 (asserts! (is-eq actual-checksum expected-checksum) ERR_BAD_CHECKSUM))
+ ;; Extract version and construct principal
+ (version (unwrap-panic (element-at? STX_VER (unwrap! (index-of? BTC_VER (unwrap-panic (element-at? decoded-hex u0))) ERR_INVALID_VERSION))))
+ )
+ (principal-construct? version (unwrap-panic (as-max-len? (unwrap-panic (slice? decoded-hex u1 (- decoded-hex-len u4))) u20)))
+ )
+)
+
+;; Example usage
+(btc-to-stx "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa") ;; Returns Stacks address
+```
+
+## Casos de uso
+
+* Mapeo de direcciones entre cadenas para puentes Bitcoin-Stacks
+* Verificando la propiedad en ambas cadenas
+* Convirtiendo direcciones de Bitcoin heredadas al formato de Stacks
+* Construyendo sistemas de autenticación entre cadenas
+
+## Conceptos clave
+
+El proceso de conversión implica:
+
+1. **Decodificación Base58**: Las direcciones de Bitcoin utilizan codificación base58
+2. **Verificación de suma de comprobación**: Los últimos 4 bytes son un checksum de doble SHA-256
+3. **Mapeo de versiones**: Los bytes de versión de Bitcoin se asignan a los bytes de versión de Stacks
+4. **Construcción principal**: Construir Stacks principal a partir de datos decodificados
diff --git a/content/docs/es/resources/snippets/convert-string-to-principal.mdx b/content/docs/es/resources/snippets/convert-string-to-principal.mdx
new file mode 100644
index 000000000..c75e122cc
--- /dev/null
+++ b/content/docs/es/resources/snippets/convert-string-to-principal.mdx
@@ -0,0 +1,52 @@
+---
+title: Convertir cadena a principal
+description: Analizar direcciones de cadena en tipos principales utilizando decodificación c32 en Clarity
+---
+```clarity
+(define-read-only (string-to-principal? (input (string-ascii 82)))
+ (let (
+ ;; Find the dot separator for contract addresses
+ (dot (default-to (len input) (index-of? input ".")))
+ ;; Extract address part (skip first char which is version)
+ (addr (unwrap! (slice? input u1 dot) ERR_INVALID_LENGTH))
+ ;; Decode c32 characters to numbers
+ (addressc32 (map unwrap-panic-uint (filter is-some-uint (map c32-index addr))))
+ ;; Validate all characters are valid c32
+ (isValidChars (asserts! (is-eq (len addr) (len addressc32)) ERR_INVALID_CHAR))
+ ;; Extract version and decode address data
+ (version (unwrap-panic (element-at? addressc32 u0)))
+ (decoded (decode-address addressc32))
+ ;; Verify checksum
+ (checksum (verify-checksum decoded version))
+ )
+ ;; Construct principal with or without contract name
+ (match (slice? input (+ u1 dot) (len input)) contract
+ (principal-construct? (to-byte version) (get-address-bytes decoded) contract)
+ (principal-construct? (to-byte version) (get-address-bytes decoded))
+ )
+ )
+)
+
+;; Example usage
+(string-to-principal? "SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKNRV9EJ7")
+;; Returns (some SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKNRV9EJ7)
+
+(string-to-principal? "SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKNRV9EJ7.my-contract")
+;; Returns (some SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKNRV9EJ7.my-contract)
+```
+
+## Casos de uso
+
+* Análisis de direcciones de entrada del usuario en contratos
+* Convirtiendo direcciones de cadena almacenadas a principales
+* Validando formatos de direcciones antes de su uso
+* Construcción de llamadas de contrato dinámicas con entradas de cadena
+
+## Conceptos clave
+
+Las direcciones de Stacks utilizan codificación c32:
+
+* **alfabeto c32**: `0123456789ABCDEFGHJKMNPQRSTVWXYZ` (sin I, L, O, U)
+* **Suma de verificación**: Los últimos 4 bytes verifican la integridad de la dirección
+* **Byte de versión**: El primer carácter indica el tipo de dirección
+* **Direcciones de contrato**: Incluir `.contract-name` sufijo
diff --git a/content/docs/es/resources/snippets/create-a-random-burn-address.mdx b/content/docs/es/resources/snippets/create-a-random-burn-address.mdx
new file mode 100644
index 000000000..c0f0218d2
--- /dev/null
+++ b/content/docs/es/resources/snippets/create-a-random-burn-address.mdx
@@ -0,0 +1,37 @@
+---
+title: Crear una dirección de quemado aleatoria
+description: Generar direcciones de quemado para eliminar permanentemente tokens de la circulación
+---
+```clarity
+(define-read-only (generate-burn-address (entropy (string-ascii 40)))
+ (let (
+ ;; Hash the entropy to create address bytes
+ (hash-bytes (hash160 (unwrap-panic (to-consensus-buff? entropy))))
+ ;; Use version byte for current network
+ (version-byte (if is-in-mainnet 0x16 0x1a))
+ )
+ ;; Construct a valid principal that no one controls
+ (principal-construct? version-byte hash-bytes)
+ )
+)
+
+;; Example: Generate unique burn address
+(generate-burn-address "BURN-2024-01-15-PROJECT-XYZ")
+;; Returns: (ok SP1FJPSG7V4QMA7D4XVPZ3B2HQ8GY3EK8GC0NGNT3)
+```
+
+## Casos de uso
+
+* Mecanismos de quema de tokens
+* Implementaciones de prueba de quemado
+* Creación de direcciones no gastables para tarifas de protocolo
+* Economía de tokens deflacionaria
+
+## Conceptos clave
+
+Las direcciones de quemado son principales válidos que:
+
+* **Sin clave privada**: Generado a partir de datos arbitrarios, no un par de claves
+* **Verificable**: Cualquiera puede verificar los tokens enviados a estas direcciones
+* **Único**: La entropía diferente crea direcciones diferentes
+* **Permanente**: Los fondos enviados se pierden irremediablemente
diff --git a/content/docs/es/resources/snippets/create-a-sponsored-tx.mdx b/content/docs/es/resources/snippets/create-a-sponsored-tx.mdx
new file mode 100644
index 000000000..b7efa5859
--- /dev/null
+++ b/content/docs/es/resources/snippets/create-a-sponsored-tx.mdx
@@ -0,0 +1,68 @@
+---
+title: Crear una transacción patrocinada
+description: Construye transacciones donde un patrocinador paga las tarifas en nombre de los usuarios
+---
+```typescript
+import { STACKS_TESTNET } from "@stacks/network";
+import { bytesToHex } from "@stacks/common";
+import {
+ broadcastTransaction,
+ deserializeTransaction,
+ makeContractCall,
+ sponsorTransaction,
+ BufferReader,
+ AnchorMode,
+ Cl,
+} from "@stacks/transactions";
+
+// Step 1: User creates the transaction with sponsored flag
+const userTxOptions = {
+ contractAddress: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",
+ contractName: "my-contract",
+ functionName: "my-function",
+ functionArgs: [Cl.uint(123)],
+ fee: 0, // User doesn't pay fees
+ senderKey: "b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01",
+ network: STACKS_TESTNET,
+ sponsored: true, // Mark as sponsored
+ anchorMode: AnchorMode.Any,
+};
+
+const transaction = await makeContractCall(userTxOptions);
+const serializedTx = bytesToHex(transaction.serialize());
+
+// Step 2: Send serialized transaction to sponsor
+// (In practice, this would be sent to a sponsorship service)
+
+// Step 3: Sponsor signs and pays fees
+const sponsorKey = "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601";
+const deserializedTx = deserializeTransaction(serializedTx);
+const sponsoredTx = await sponsorTransaction({
+ transaction: deserializedTx,
+ sponsorPrivateKey: sponsorKey,
+ fee: 1000, // Sponsor pays the fee
+ sponsorNonce: 0,
+});
+
+// Step 4: Broadcast the sponsored transaction
+const broadcastResponse = await broadcastTransaction({
+ transaction: sponsoredTx,
+ network: STACKS_TESTNET,
+});
+
+console.log("Sponsored transaction ID:", broadcastResponse.txid);
+```
+
+## Casos de uso
+
+* Incorporación de nuevos usuarios sin STX para tarifas
+* Subsidiando los costos de transacción para usuarios de dApps
+* Aplicaciones empresariales que pagan por transacciones de usuarios
+* Aplicaciones de juegos con una experiencia de usuario fluida
+
+## Conceptos clave
+
+Las transacciones patrocinadas tienen dos partes:
+
+* **Usuario**: Crea y firma la transacción con `sponsored: true`
+* **Patrocinador**: Paga las tarifas y transmite la transacción
diff --git a/content/docs/es/resources/snippets/create-sha256-hash-clarity.mdx b/content/docs/es/resources/snippets/create-sha256-hash-clarity.mdx
new file mode 100644
index 000000000..79a33844e
--- /dev/null
+++ b/content/docs/es/resources/snippets/create-sha256-hash-clarity.mdx
@@ -0,0 +1,33 @@
+---
+title: Crear hash SHA256 en Clarity
+description: Generar hashes SHA-256 a partir de datos de buffer en contratos inteligentes de Clarity
+---
+```clarity
+(define-read-only (create-sha256-hash (data (buff 4096)))
+ (sha256 (unwrap-panic (to-consensus-buff? data)))
+)
+
+;; Example usage
+(define-read-only (hash-message (message (string-utf8 200)))
+ (create-sha256-hash (unwrap-panic (to-consensus-buff? message)))
+)
+
+;; Hash a simple string
+(print (hash-message u"Hello World"))
+```
+
+## Casos de uso
+
+* Creando identificadores únicos a partir de datos
+* Verificando la integridad de datos en contratos
+* Implementación de esquemas de compromiso-revelación
+* Construyendo árboles de Merkle para pruebas
+
+## Conceptos clave
+
+La implementación de SHA-256 en Clarity:
+
+* Toma un búfer como entrada (máximo 1MB)
+* Devuelve un hash de búfer de 32 bytes
+* Usos `to-consensus-buff?` para garantizar una codificación coherente
+* Produce el mismo hash que las implementaciones fuera de la cadena
diff --git a/content/docs/es/resources/snippets/create-sha256-hash-stacks-js.mdx b/content/docs/es/resources/snippets/create-sha256-hash-stacks-js.mdx
new file mode 100644
index 000000000..686fba542
--- /dev/null
+++ b/content/docs/es/resources/snippets/create-sha256-hash-stacks-js.mdx
@@ -0,0 +1,45 @@
+---
+title: Crear hash SHA256 en Stacks.js
+description: Generar hashes SHA-256 que coincidan con la salida de hash de Clarity
+---
+```typescript
+import { sha256 } from "@noble/hashes/sha256";
+import { bytesToHex, hexToBytes, utf8ToBytes } from "@stacks/common";
+import { bufferCV, stringUtf8CV, serializeCV } from "@stacks/transactions";
+
+// Hash a string (matching Clarity's sha256 output)
+function hashString(text: string) {
+ const clarityValue = stringUtf8CV(text);
+ const serialized = serializeCV(clarityValue);
+ return bytesToHex(sha256(serialized));
+}
+
+// Hash hex data (matching Clarity's sha256 output)
+function hashHexData(hexData: string) {
+ const clarityValue = bufferCV(hexToBytes(hexData));
+ const serialized = serializeCV(clarityValue);
+ return bytesToHex(sha256(serialized));
+}
+
+// Example usage
+const hash1 = hashString("Hello World");
+console.log("String hash:", hash1);
+
+const hash2 = hashHexData("0x1234567890abcdef");
+console.log("Hex hash:", hash2);
+```
+
+## Casos de uso
+
+* Creando identificadores deterministas
+* Verificando la integridad de los datos entre on-chain y off-chain
+* Implementación de esquemas de compromiso-revelación fuera de la cadena
+* Construyendo árboles de Merkle compatibles con Clarity
+
+## Conceptos clave
+
+Para que coincida con la salida SHA-256 de Clarity:
+
+1. **Convertir a valor de Clarity**: Utilice el tipo de CV apropiado (`stringUtf8CV`, `bufferCV`, etc.)
+2. **Serializar**: Uso `serializeCV` para coincidir con la codificación de Clarity
+3. **Hash**: Aplicar SHA-256 a los bytes serializados
diff --git a/content/docs/es/resources/snippets/deploy-a-contract.mdx b/content/docs/es/resources/snippets/deploy-a-contract.mdx
new file mode 100644
index 000000000..fe78ce09c
--- /dev/null
+++ b/content/docs/es/resources/snippets/deploy-a-contract.mdx
@@ -0,0 +1,54 @@
+---
+title: Desplegar un contrato
+description: Desplegar un contrato inteligente de Clarity en la cadena de bloques de Stacks utilizando Stacks.js
+---
+```typescript
+import { STACKS_TESTNET } from "@stacks/network";
+import {
+ makeContractDeploy,
+ broadcastTransaction,
+ AnchorMode,
+ PostConditionMode
+} from "@stacks/transactions";
+
+const contractCode = `
+(define-data-var counter uint u0)
+
+(define-public (increment)
+ (ok (var-set counter (+ (var-get counter) u1))))
+
+(define-read-only (get-counter)
+ (ok (var-get counter)))
+`;
+
+const txOptions = {
+ contractName: "my-counter",
+ codeBody: contractCode,
+ senderKey: "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601",
+ network: STACKS_TESTNET,
+ anchorMode: AnchorMode.Any,
+ postConditionMode: PostConditionMode.Allow,
+ fee: 100000n, // Set an appropriate fee
+};
+
+const transaction = await makeContractDeploy(txOptions);
+const broadcastResponse = await broadcastTransaction({ transaction });
+console.log("Contract deployed!");
+console.log("Transaction ID:", broadcastResponse.txid);
+```
+
+## Casos de uso
+
+* Desplegando nuevos contratos inteligentes en la red principal o en la red de pruebas
+* Automatizando despliegues de contratos en pipelines de CI/CD
+* Despliegue programático de contratos para la inicialización de dApps
+* Implementando actualizaciones o nuevas versiones de contratos
+
+## Conceptos clave
+
+El despliegue del contrato requiere:
+
+* **Nombre del contrato**: Identificador único para su contrato (letras, números, guiones)
+* **Cuerpo del código**: El código del contrato Clarity como una cadena
+* **Clave del remitente**: Clave privada de la cuenta que despliega el contrato
+* **Red**: Red objetivo (mainnet, testnet o devnet)
diff --git a/content/docs/es/resources/snippets/derive-principal-addresses-between-networks.mdx b/content/docs/es/resources/snippets/derive-principal-addresses-between-networks.mdx
new file mode 100644
index 000000000..df6e5346a
--- /dev/null
+++ b/content/docs/es/resources/snippets/derive-principal-addresses-between-networks.mdx
@@ -0,0 +1,64 @@
+---
+title: Derivar direcciones principales entre redes
+description: Convierte direcciones entre mainnet y testnet extrayendo y reconstruyendo con diferentes bytes de versión
+---
+```clarity
+;; Extract hash bytes from an address
+(define-read-only (get-address-hash-bytes (address principal))
+ (get hash-bytes (unwrap-panic (principal-destruct? address)))
+)
+
+;; Convert testnet address to mainnet
+(define-read-only (testnet-to-mainnet (testnet-address principal))
+ (let (
+ ;; Extract the hash bytes from testnet address
+ (hash-bytes (get-address-hash-bytes testnet-address))
+ ;; Mainnet version byte
+ (mainnet-version 0x16)
+ )
+ ;; Reconstruct with mainnet version
+ (principal-construct? mainnet-version hash-bytes)
+ )
+)
+
+;; Convert mainnet address to testnet
+(define-read-only (mainnet-to-testnet (mainnet-address principal))
+ (let (
+ ;; Extract the hash bytes from mainnet address
+ (hash-bytes (get-address-hash-bytes mainnet-address))
+ ;; Testnet version byte
+ (testnet-version 0x1a)
+ )
+ ;; Reconstruct with testnet version
+ (principal-construct? testnet-version hash-bytes)
+ )
+)
+
+;; Example usage
+(testnet-to-mainnet 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)
+;; Returns: (ok SP1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R)
+```
+
+## Casos de uso
+
+* Verificación de direcciones entre redes
+* Construyendo dApps multi-red
+* Herramientas de validación de direcciones
+* Utilidades de migración de red
+
+## Conceptos clave
+
+Las direcciones de Stacks consisten en:
+
+* **Byte de versión**: Indica el tipo de red y dirección
+* **Bytes de hash**: hash de 20 bytes de la clave pública
+* **Suma de verificación**: Incorporado en la codificación c32
+
+### Referencia de bytes de versión
+
+| Versión | Red | Tipo | Prefijo |
+|---------|------|------|--------|
+| 0x16 | Red principal | Estándar | SP |
+| 0x17 | Red principal | Contrato | SM |
+| 0x1a | Red de pruebas | Estándar | ST |
+| 0x1b | Red de pruebas | Contrato | SN |
diff --git a/content/docs/es/resources/snippets/derive-stacks-address-from-keys.mdx b/content/docs/es/resources/snippets/derive-stacks-address-from-keys.mdx
new file mode 100644
index 000000000..9e1a816ac
--- /dev/null
+++ b/content/docs/es/resources/snippets/derive-stacks-address-from-keys.mdx
@@ -0,0 +1,39 @@
+---
+title: Obtener dirección de Stacks a partir de claves
+description: Generar direcciones de Stacks a partir de claves privadas o públicas utilizando múltiples métodos
+---
+```typescript
+import { getPublicKeyFromPrivate } from "@stacks/encryption";
+import {
+ getAddressFromPrivateKey,
+ getAddressFromPublicKey
+} from "@stacks/transactions";
+
+// Derive address from private key
+const privateKey = process.env.PRIVATE_KEY; // Keep this secret!
+const addressFromPrivate = getAddressFromPrivateKey(privateKey, "testnet");
+
+// Derive public key and address
+const publicKey = getPublicKeyFromPrivate(privateKey);
+const addressFromPublic = getAddressFromPublicKey(publicKey, "testnet");
+
+console.log("Address:", addressFromPrivate);
+console.log("Public key:", publicKey);
+console.log("Same address:", addressFromPrivate === addressFromPublic); // true
+```
+
+## Casos de uso
+
+* Generación de dirección de billetera
+* Validación de par de claves
+* Recuperación de dirección a partir de claves de respaldo
+* Configuración de billetera multifirma
+
+## Conceptos clave
+
+Las direcciones de Stacks se derivan a través de:
+
+* **Clave privada**: número aleatorio de 32 bytes (¡mantenlo en secreto!)
+* **Clave pública**: Derivado de la clave privada utilizando ECDSA
+* **Dirección**: Hash de clave pública codificado en Base58check
+* **Red**: Diferentes prefijos para mainnet (SP/SM) frente a testnet (ST/SN)
diff --git a/content/docs/es/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx b/content/docs/es/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx
new file mode 100644
index 000000000..1069135fd
--- /dev/null
+++ b/content/docs/es/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx
@@ -0,0 +1,45 @@
+---
+title: Obtener Bitcoin de testnet en regtest
+description: Solicita BTC de testnet desde el faucet de Hiro para desarrollo y pruebas locales
+---
+```typescript
+const TESTNET_ADDRESS = 'bcrt1q728h29ejjttmkupwdkyu2x4zcmkuc3q29gvwaa';
+
+try {
+ const response = await fetch(
+ `https://api.testnet.hiro.so/extended/v1/faucets/btc?address=${TESTNET_ADDRESS}`,
+ {
+ method: 'POST',
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }
+ );
+
+ const result = await response.json();
+ console.log("Faucet response:", result);
+
+ if (result.success) {
+ console.log(`Transaction ID: ${result.txid}`);
+ console.log(`Amount sent: ${result.amount} sats`);
+ }
+} catch (error) {
+ console.error("Faucet request failed:", error);
+}
+```
+
+## Casos de uso
+
+* Desarrollo local con transacciones de Bitcoin
+* Probando operaciones de sBTC
+* Pruebas de integración para aplicaciones de cadenas cruzadas
+* Desarrollando contratos inteligentes conscientes de Bitcoin
+
+## Conceptos clave
+
+El faucet de la testnet de Hiro:
+
+* **Limitado por tasa**: Una solicitud por dirección por hora
+* **Cantidad**: Envía 0.5 BTC de testnet por solicitud
+* **Red**: Funciona con direcciones de testnet/regtest de Bitcoin
+* **Formato**: Admite direcciones legacy, segwit y taproot
diff --git a/content/docs/es/resources/snippets/filter-items-from-a-list.mdx b/content/docs/es/resources/snippets/filter-items-from-a-list.mdx
new file mode 100644
index 000000000..9c391185b
--- /dev/null
+++ b/content/docs/es/resources/snippets/filter-items-from-a-list.mdx
@@ -0,0 +1,36 @@
+---
+title: Filtrar elementos de una lista
+description: Eliminar elementos específicos de listas usando fold en Clarity
+---
+```clarity
+(define-read-only (filter-item (l (list 100 uint)) (remove uint))
+ (get newList (fold remove-value l { compareTo: remove, newList: (list) }))
+)
+
+(define-private (remove-value (listValue uint) (trackerTuple { compareTo: uint, newList: (list 100 uint) }))
+ (merge trackerTuple {newList:
+ (if (is-eq listValue (get compareTo trackerTuple))
+ (get newList trackerTuple)
+ (unwrap-panic (as-max-len? (append (get newList trackerTuple) listValue) u100))
+ )
+ })
+)
+
+;; Example usage
+(filter-item (list u1 u2 u3 u2 u4) u2) ;; Returns (u1 u3 u4)
+```
+
+## Casos de uso
+
+* Eliminando direcciones en la lista negra de las listas de acceso
+* Filtrando tareas completadas de las listas de tareas pendientes
+* Excluyendo tokens específicos de los portafolios
+* Limpieza de datos en contratos inteligentes
+
+## Conceptos clave
+
+Este patrón utiliza `fold` para iterar a través de una lista y construir una nueva lista:
+
+* **Acumulador**: Rastrea el valor a eliminar y construye la nueva lista
+* **Anexión condicional**: Solo agrega elementos que no coinciden con el filtro
+* **Seguridad de tipos**: Mantiene el tipo de lista y la longitud máxima
diff --git a/content/docs/es/resources/snippets/generate-a-secret-key.mdx b/content/docs/es/resources/snippets/generate-a-secret-key.mdx
new file mode 100644
index 000000000..c82fdf0e3
--- /dev/null
+++ b/content/docs/es/resources/snippets/generate-a-secret-key.mdx
@@ -0,0 +1,31 @@
+---
+title: Generar una clave secreta
+description: Crear frases semilla mnemotécnicas para la generación de billeteras
+---
+```typescript
+import { generateSecretKey } from '@stacks/wallet-sdk';
+
+// Generate a 24-word mnemonic (256 bits of entropy)
+const mnemonic24 = generateSecretKey();
+// Example: "aunt birth lounge misery utility blind holiday walnut fuel make gift parent gap picnic exact various express sphere family nerve oil drill engage youth"
+
+// Generate a 12-word mnemonic (128 bits of entropy)
+const mnemonic12 = generateSecretKey(128);
+// Example: "winter crash infant long upset beauty cram tank short remain obtain sauce"
+```
+
+## Casos de uso
+
+* Creando nuevas frases semilla de billetera
+* Generando entropía segura para aplicaciones
+* Creación de flujos de creación de billeteras
+* Probando la funcionalidad de la billetera
+
+## Conceptos clave
+
+Las frases semilla mnemotécnicas siguen el estándar BIP39:
+
+* **Entropía**: Datos aleatorios utilizados para generar la frase
+* **Recuento de palabras**: 12 palabras (128 bits) o 24 palabras (256 bits)
+* **Lista de palabras**: Lista estandarizada de 2048 palabras
+* **Suma de verificación**: Detección de errores incorporada
diff --git a/content/docs/es/resources/snippets/generate-a-wallet.mdx b/content/docs/es/resources/snippets/generate-a-wallet.mdx
new file mode 100644
index 000000000..29bbf91c7
--- /dev/null
+++ b/content/docs/es/resources/snippets/generate-a-wallet.mdx
@@ -0,0 +1,34 @@
+---
+title: Generar una cartera
+description: Crea una nueva billetera con frase mnemotécnica o restaura desde una semilla existente
+---
+```typescript
+import { generateWallet, generateSecretKey } from '@stacks/wallet-sdk';
+
+// Generate a new wallet with a new 24-word seed phrase
+const secretKey = generateSecretKey(256); // 256 bits = 24 words
+const wallet = await generateWallet({
+ secretKey,
+ password: 'your-secure-password',
+});
+
+// Access the first account
+const account = wallet.accounts[0];
+console.log('Address:', account.stxAddress);
+console.log('Mnemonic:', secretKey);
+```
+
+## Casos de uso
+
+* Creando nuevas billeteras para usuarios
+* Restauración de billeteras a partir de frases semilla
+* Generando direcciones de billetera deterministas
+* Creando aplicaciones de billetera
+
+## Conceptos clave
+
+El SDK de la billetera genera billeteras determinísticas jerárquicas (HD) siguiendo los estándares BIP32/BIP39:
+
+* **Clave secreta**: Puede ser una frase mnemotécnica o clave privada
+* **Contraseña**: Cifra la cartera (diferente de la frase de contraseña mnemónica)
+* **Cuentas**: Se pueden derivar múltiples cuentas de una sola semilla
diff --git a/content/docs/es/resources/snippets/generate-random-number.mdx b/content/docs/es/resources/snippets/generate-random-number.mdx
new file mode 100644
index 000000000..b8b6cba8c
--- /dev/null
+++ b/content/docs/es/resources/snippets/generate-random-number.mdx
@@ -0,0 +1,46 @@
+---
+title: Generar número aleatorio
+description: Crear números pseudo-aleatorios utilizando hashes de bloques para obtener aleatoriedad en contratos inteligentes
+---
+```clarity
+(define-read-only (generate-random (block-height uint))
+ (let (
+ ;; Get block header hash
+ (block-hash (unwrap! (get-stacks-block-info? id-header-hash block-height) (err u1001)))
+ ;; Take a slice of the hash for randomness
+ (hash-slice (unwrap-panic (slice? block-hash u16 u32)))
+ ;; Convert to uint
+ (random-value (buff-to-uint-be (unwrap-panic (as-max-len? hash-slice u16))))
+ )
+ (ok random-value)
+ )
+)
+
+;; Generate random number in range
+(define-read-only (random-in-range (block-height uint) (min uint) (max uint))
+ (let (
+ (random (try! (generate-random block-height)))
+ (range (- max min))
+ )
+ (ok (+ min (mod random (+ u1 range))))
+ )
+)
+
+;; Example: Random between 1-100
+(random-in-range block-height u1 u100)
+```
+
+## Casos de uso
+
+* Contratos de lotería y juegos de azar
+* Generación aleatoria de rasgos de NFT
+* Mecanismos de distribución justa
+* Selección aleatoria de listas
+
+## Conceptos clave
+
+La aleatoriedad de la cadena de bloques es determinista pero impredecible:
+
+* **Hashes de bloque**: Usar datos históricos de bloques como fuente de entropía
+* **Bloques futuros**: No se pueden predecir los futuros hashes de bloques
+* **Esquemas de compromiso**: Combinar con commit-reveal para equidad
diff --git a/content/docs/es/resources/snippets/get-account-details-from-wallet.mdx b/content/docs/es/resources/snippets/get-account-details-from-wallet.mdx
new file mode 100644
index 000000000..641f1533b
--- /dev/null
+++ b/content/docs/es/resources/snippets/get-account-details-from-wallet.mdx
@@ -0,0 +1,52 @@
+---
+title: Obtener detalles de la cuenta desde la billetera
+description: Extraer direcciones, claves y otra información de cuenta de una instancia de billetera
+---
+```typescript
+import { STACKS_TESTNET, STACKS_MAINNET } from "@stacks/network";
+import { generateWallet, getStxAddress } from "@stacks/wallet-sdk";
+
+// Generate or restore wallet
+const wallet = await generateWallet({
+ secretKey: "your twenty four word mnemonic phrase goes here...",
+ password: "wallet-password",
+});
+
+// Get first account
+const account = wallet.accounts[0];
+
+// Get addresses for different networks
+const testnetAddress = getStxAddress({
+ account,
+ transactionVersion: 0 // testnet
+});
+
+const mainnetAddress = getStxAddress({
+ account,
+ transactionVersion: 1 // mainnet
+});
+
+// Get keys
+const privateKey = account.stxPrivateKey;
+const publicKey = account.stxPublicKey;
+
+console.log("Testnet address:", testnetAddress);
+console.log("Mainnet address:", mainnetAddress);
+console.log("Public key:", publicKey);
+```
+
+## Casos de uso
+
+* Mostrando direcciones de usuario en interfaces de billeteras
+* Obtención de claves privadas para la firma de transacciones
+* Derivando direcciones para diferentes redes
+* Construyendo herramientas de gestión de billeteras
+
+## Conceptos clave
+
+Las cuentas de billetera contienen:
+
+* **Clave privada**: Se utiliza para firmar transacciones
+* **Clave pública**: Derivado de la clave privada
+* **Direcciones**: Específico de la red (red principal vs red de pruebas)
+* **Ruta de derivación**: Ruta BIP44 utilizada para generar la cuenta
diff --git a/content/docs/es/resources/snippets/helper-function-to-restrict-contract-calls.mdx b/content/docs/es/resources/snippets/helper-function-to-restrict-contract-calls.mdx
new file mode 100644
index 000000000..ccf3ed392
--- /dev/null
+++ b/content/docs/es/resources/snippets/helper-function-to-restrict-contract-calls.mdx
@@ -0,0 +1,35 @@
+---
+title: Función auxiliar para restringir llamadas a contratos
+description: Implementar control de acceso para garantizar que las funciones solo puedan ser llamadas por usuarios, no por otros contratos
+---
+```clarity
+;; Check if caller is a standard principal (user wallet)
+(define-private (is-standard-principal-call)
+ (is-none (get name (unwrap! (principal-destruct? contract-caller) false)))
+)
+
+;; Public function restricted to direct user calls
+(define-public (user-only-function (amount uint))
+ (begin
+ (asserts! (is-standard-principal-call) (err u401))
+ ;; Function logic here
+ (ok true)
+ )
+)
+```
+
+## Casos de uso
+
+* Prevención de ataques de reentrada de contrato a contrato
+* Garantizando transacciones iniciadas por humanos para la gobernanza
+* Restringir la acuñación de tokens a acciones directas del usuario
+* Protegiendo las funciones de administrador de llamadas automatizadas
+
+## Conceptos clave
+
+Tipos principales en Clarity:
+
+* **Directores estándar**: Billeteras de usuario (direcciones SP/ST)
+* **Principales del contrato**: Contratos desplegados (dirección.nombre-del-contrato)
+* **contrato-llamador**: El llamante inmediato de la función actual
+* **tx-remitente**: El iniciador original de la transacción
diff --git a/content/docs/es/resources/snippets/index.mdx b/content/docs/es/resources/snippets/index.mdx
new file mode 100644
index 000000000..565a0db2f
--- /dev/null
+++ b/content/docs/es/resources/snippets/index.mdx
@@ -0,0 +1,75 @@
+---
+title: Fragmentos
+sidebarTitle: Visión general
+description: Ejemplos de código listos para usar para construir en Stacks y Bitcoin
+llm: false
+---
+## Visión general
+
+Para explorar Snippets con IA, copie y pegue [llms.txt](/resources/snippets/llms.txt) en tu LLM de preferencia.
+
+## Transacciones
+
+### Transferencias de Tokens
+
+* [Transferir STX](/resources/snippets/transfer-stx) - Enviar tokens STX entre direcciones
+* [Transferir un token SIP-10](/resources/snippets/transfer-a-sip10-token) - Transferir tokens fungibles
+
+### Construcción de Transacciones
+
+* [Construir una transacción sin firmar](/resources/snippets/build-an-unsigned-tx) - Crear transacciones para billeteras de hardware
+* [Crear una transacción patrocinada](/resources/snippets/create-a-sponsored-tx) - Pagar tarifas en nombre de los usuarios
+
+### Poscondiciones
+
+* [Construir una post-condición STX](/resources/snippets/build-a-stx-pc) - Transferencias seguras de STX
+* [Construir una post-condición FT](/resources/snippets/build-an-ft-pc) - Transferencias seguras de tokens fungibles
+* [Construir una post-condición NFT](/resources/snippets/build-an-nft-pc) - Transferencias seguras de NFT
+
+## Contratos Inteligentes
+
+### Despliegue de Contratos
+
+* [Desplegar un contrato](/resources/snippets/deploy-a-contract) - Desplegar contratos en la cadena de bloques
+
+### Funciones de Clarity
+
+* [Crear hash SHA256](/resources/snippets/create-sha256-hash-clarity) - Generar hashes en Clarity
+* [Filtrar elementos de una lista](/resources/snippets/filter-items-from-a-list) - Manipulación de listas en Clarity
+* [Generar número aleatorio](/resources/snippets/generate-random-number) - Números pseudo-aleatorios en contratos
+* [Comprobar duplicados](/resources/snippets/check-for-duplicates) - Encontrar elementos duplicados en listas
+* [Devolver una entrada de un mapa](/resources/snippets/return-an-entry-from-a-map) - Acceder a estructuras de datos de mapas
+* [Función auxiliar para restringir llamadas a contratos](/resources/snippets/helper-function-to-restrict-contract-calls) - Patrones de control de acceso
+
+## Cuentas y Direcciones
+
+### Gestión de Billetera
+
+* [Generar una cartera](/resources/snippets/generate-a-wallet) - Crear nueva cartera con mnemónico
+* [Generar una clave secreta](/resources/snippets/generate-a-secret-key) - Crear claves privadas
+* [Obtener detalles de la cuenta desde la billetera](/resources/snippets/get-account-details-from-wallet) - Extraer información de la cuenta
+
+### Utilidades de Dirección
+
+* [Convertir dirección BTC a STX](/resources/snippets/convert-btc-to-stx-address) - Conversión de direcciones entre cadenas
+* [Convertir cadena a principal](/resources/snippets/convert-string-to-principal) - Analizar direcciones principales
+* [Obtener dirección de Stacks a partir de claves](/resources/snippets/derive-stacks-address-from-keys) - Generar direcciones a partir de pares de claves
+* [Derivar direcciones principales entre redes](/resources/snippets/derive-principal-addresses-between-networks) - Mapeo de direcciones de red
+* [Crear una dirección de quemado aleatoria](/resources/snippets/create-a-random-burn-address) - Generar direcciones de quemado
+
+## Criptografía y Seguridad
+
+### Hashing
+
+* [Crear hash SHA256 (Stacks.js)](/resources/snippets/create-sha256-hash-stacks-js) - Generar hashes en JavaScript
+* [Crear hash SHA256 (Clarity)](/resources/snippets/create-sha256-hash-clarity) - Generar hashes en contratos inteligentes
+
+### Integración de API
+
+* [Integrar claves de API usando Stacks.js](/resources/snippets/integrate-api-keys-using-stacksjs) - Uso seguro de claves API
+
+## Herramientas de Desarrollo
+
+### Probando
+
+* [Obtener Bitcoin de testnet en regtest](/resources/snippets/fetch-testnet-bitcoin-on-regtest) - Obtener BTC de prueba para desarrollo
diff --git a/content/docs/es/resources/snippets/integrate-api-keys-using-stacksjs.mdx b/content/docs/es/resources/snippets/integrate-api-keys-using-stacksjs.mdx
new file mode 100644
index 000000000..d273e0859
--- /dev/null
+++ b/content/docs/es/resources/snippets/integrate-api-keys-using-stacksjs.mdx
@@ -0,0 +1,37 @@
+---
+title: Integrar claves de API usando Stacks.js
+description: Configurar Stacks.js para usar claves API para límites de tasa mejorados y monitoreo
+---
+```typescript
+import { createApiKeyMiddleware, createFetchFn } from "@stacks/common";
+import { StacksMainnet, StacksTestnet } from "@stacks/network";
+
+// Create middleware with your API key
+const apiMiddleware = createApiKeyMiddleware({
+ apiKey: process.env.HIRO_API_KEY
+});
+
+// Create custom fetch function
+const customFetch = createFetchFn(apiMiddleware);
+
+// Configure network with API key
+const network = new StacksMainnet({
+ fetchFn: customFetch
+});
+```
+
+## Casos de uso
+
+* Aumento de los límites de tasa de API para aplicaciones en producción
+* Monitoreo y análisis del uso de API
+* Acceso prioritario durante períodos de alto tráfico
+* Funciones de soporte empresarial personalizadas
+
+## Conceptos clave
+
+Beneficios de la clave API:
+
+* **Límites de tasa más altos**: 500 solicitudes/minuto frente a 50 para anónimos
+* **Seguimiento de uso**: Monitorea tu consumo de API
+* **Cola de prioridad**: Mejor rendimiento durante las horas pico
+* **Soporte**: Acceso a canales de soporte dedicados
diff --git a/content/docs/es/resources/snippets/meta.json b/content/docs/es/resources/snippets/meta.json
new file mode 100644
index 000000000..6c1e693f1
--- /dev/null
+++ b/content/docs/es/resources/snippets/meta.json
@@ -0,0 +1,38 @@
+{
+ "title": "Snippets",
+ "root": true,
+ "pages": [
+ "---Snippets---",
+ "index",
+ "---Transactions---",
+ "transfer-stx",
+ "transfer-a-sip10-token",
+ "build-an-unsigned-tx",
+ "create-a-sponsored-tx",
+ "build-a-stx-pc",
+ "build-an-ft-pc",
+ "build-an-nft-pc",
+ "---Smart Contracts---",
+ "deploy-a-contract",
+ "create-sha256-hash-clarity",
+ "filter-items-from-a-list",
+ "generate-random-number",
+ "check-for-duplicates",
+ "return-an-entry-from-a-map",
+ "helper-function-to-restrict-contract-calls",
+ "---Accounts & Addresses---",
+ "generate-a-wallet",
+ "generate-a-secret-key",
+ "get-account-details-from-wallet",
+ "convert-btc-to-stx-address",
+ "convert-string-to-principal",
+ "derive-stacks-address-from-keys",
+ "derive-principal-addresses-between-networks",
+ "create-a-random-burn-address",
+ "---Cryptography & Security---",
+ "create-sha256-hash-stacks-js",
+ "integrate-api-keys-using-stacksjs",
+ "---Development Tools---",
+ "fetch-testnet-bitcoin-on-regtest"
+ ]
+}
diff --git a/content/docs/es/resources/snippets/return-an-entry-from-a-map.mdx b/content/docs/es/resources/snippets/return-an-entry-from-a-map.mdx
new file mode 100644
index 000000000..bdd5e16aa
--- /dev/null
+++ b/content/docs/es/resources/snippets/return-an-entry-from-a-map.mdx
@@ -0,0 +1,46 @@
+---
+title: Devolver una entrada de un mapa
+description: Consultar datos del mapa de contratos utilizando el endpoint map_entry de la API de Stacks
+---
+```typescript
+import { Cl, cvToHex } from "@stacks/transactions";
+
+// Query a map entry from a contract
+const contractAddress = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM";
+const contractName = "my-contract";
+const mapName = "user-balances";
+
+// Create the map key (e.g., a principal)
+const mapKey = Cl.standardPrincipal("ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5");
+
+const response = await fetch(
+ `https://api.hiro.so/v2/map_entry/${contractAddress}/${contractName}/${mapName}`,
+ {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(cvToHex(mapKey)),
+ }
+);
+
+const result = await response.json();
+const data = result.data ? Cl.deserialize(result.data) : null;
+
+console.log("Map value:", data);
+```
+
+## Casos de uso
+
+* Leyendo saldos de usuarios desde contratos de tokens
+* Verificando registros de propiedad de NFT
+* Recuperando valores de configuración de contratos
+* Monitoreando el estado del contrato sin transacciones
+
+## Conceptos clave
+
+La API map\_entry:
+
+* **Solicitud POST**: Enviar la clave del mapa serializado
+* **Codificación hexadecimal**: Las claves deben ser valores de Clarity codificados en hexadecimal
+* **Formato de respuesta**: Devuelve el valor de Clarity codificado en hexadecimal o null
diff --git a/content/docs/es/resources/snippets/transfer-a-sip10-token.mdx b/content/docs/es/resources/snippets/transfer-a-sip10-token.mdx
new file mode 100644
index 000000000..444da7175
--- /dev/null
+++ b/content/docs/es/resources/snippets/transfer-a-sip10-token.mdx
@@ -0,0 +1,68 @@
+---
+title: Transferir un token SIP-10
+description: Transferir tokens fungibles utilizando el estándar SIP-10 con post-condiciones
+---
+```typescript
+import { STACKS_MAINNET } from "@stacks/network";
+import {
+ AnchorMode,
+ broadcastTransaction,
+ Cl,
+ makeContractCall,
+ Pc,
+ PostConditionMode,
+} from "@stacks/transactions";
+
+// Token contract details
+const tokenAddress = "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9";
+const tokenName = "wrapped-bitcoin";
+const contractIdentifier = `${tokenAddress}.${tokenName}`;
+
+// Create post-condition to ensure exact amount is transferred
+const postConditions = [
+ Pc.principal("SP2C20XGZBAYFZ1NYNHT1J6MGBGVX9X7X3P7LAX7K")
+ .willSendEq(100000000) // 1 wBTC (8 decimals)
+ .ft(contractIdentifier, tokenName)
+];
+
+const txOptions = {
+ contractAddress: tokenAddress,
+ contractName: tokenName,
+ functionName: "transfer",
+ functionArgs: [
+ Cl.uint(100000000), // amount (with decimals)
+ Cl.principal("SP2C20XGZBAYFZ1NYNHT1J6MGBGVX9X7X3P7LAX7K"), // sender
+ Cl.principal("SP31DA84DWTF6510EW6DCTC3GB3XH1EEBGP7MYT2"), // recipient
+ Cl.none(), // optional memo
+ ],
+ senderKey: "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601",
+ validateWithAbi: true,
+ network: STACKS_MAINNET,
+ postConditions,
+ postConditionMode: PostConditionMode.Deny,
+ anchorMode: AnchorMode.Any,
+};
+
+const transaction = await makeContractCall(txOptions);
+const broadcastResponse = await broadcastTransaction({
+ transaction,
+ network: STACKS_MAINNET,
+});
+
+console.log("Transaction ID:", broadcastResponse.txid);
+```
+
+## Casos de uso
+
+* Transferir tokens fungibles entre billeteras
+* Integrando transferencias de tokens en dApps
+* Construyendo funcionalidad de DEX o intercambio
+* Implementación de sistemas de pago con tokens personalizados
+
+## Conceptos clave
+
+SIP-10 es el estándar de token fungible en Stacks, similar a ERC-20:
+
+* **Interfaz estándar**: Todos los tokens SIP-10 implementan `transfer`, `get-balance`, etc.
+* **Postcondiciones**: Proteger a los usuarios asegurando que se transfieran cantidades exactas
+* **Memorandos**: Campo opcional para incluir notas de transferencia
diff --git a/content/docs/es/resources/snippets/transfer-stx.mdx b/content/docs/es/resources/snippets/transfer-stx.mdx
new file mode 100644
index 000000000..3e825e9ed
--- /dev/null
+++ b/content/docs/es/resources/snippets/transfer-stx.mdx
@@ -0,0 +1,49 @@
+---
+title: Transferir STX
+description: Envía tokens STX entre direcciones con post-condiciones para transferencias seguras
+---
+```typescript
+import { STACKS_TESTNET } from "@stacks/network";
+import {
+ AnchorMode,
+ broadcastTransaction,
+ makeSTXTokenTransfer,
+ Pc,
+ PostConditionMode,
+} from "@stacks/transactions";
+
+// Define sender and recipient
+const senderAddress = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM";
+const recipientAddress = "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5";
+
+// Create post-condition to ensure exact amount is sent
+const postConditions = Pc.principal(senderAddress)
+ .willSendEq(1000000) // 1 STX in micro-STX
+ .ustx();
+
+// Configure transaction options
+const txOptions = {
+ recipient: recipientAddress,
+ amount: 1000000, // 1 STX in micro-STX
+ senderKey: "753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601",
+ network: STACKS_TESTNET,
+ memo: "Transfer memo", // Optional memo field
+ postConditions: [postConditions],
+ postConditionMode: PostConditionMode.Deny,
+ anchorMode: AnchorMode.Any,
+};
+
+// Create and broadcast the transaction
+const transaction = await makeSTXTokenTransfer(txOptions);
+const broadcastResponse = await broadcastTransaction({ transaction });
+console.log("Transaction ID:", broadcastResponse.txid);
+```
+
+## Casos de uso
+
+* Transferir tokens STX de forma segura entre direcciones
+* Validando montos de transacciones para transferencias seguras
+
+## Conceptos clave
+
+* **Postcondiciones**: Asegúrate de que se transfiera la cantidad exacta de STX
diff --git a/content/docs/es/resources/templates/index.mdx b/content/docs/es/resources/templates/index.mdx
new file mode 100644
index 000000000..6c2b10c5c
--- /dev/null
+++ b/content/docs/es/resources/templates/index.mdx
@@ -0,0 +1,6 @@
+---
+title: Plantillas de proyectos
+description: Plantillas de proyectos para construir en Stacks.
+llm: false
+---
+## Plantillas de proyectos
diff --git a/content/docs/es/resources/templates/meta.json b/content/docs/es/resources/templates/meta.json
new file mode 100644
index 000000000..1fe5c96f2
--- /dev/null
+++ b/content/docs/es/resources/templates/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Project templates",
+ "root": true,
+ "pages": ["index", "..."]
+}
diff --git a/content/docs/es/start/index.mdx b/content/docs/es/start/index.mdx
new file mode 100644
index 000000000..27252732a
--- /dev/null
+++ b/content/docs/es/start/index.mdx
@@ -0,0 +1,101 @@
+---
+title: Empezar
+description: Comienza a construir aplicaciones descentralizadas en Stacks con las herramientas de Hiro.
+sidebarTitle: Visión general
+full: true
+llm: false
+---
+import { Card as MainCard, SecondaryCard, SmallCard } from '@/components/card';
+import { ImageZoom } from 'fumadocs-ui/components/image-zoom';
+import { PageFooter } from '@/components/footer';
+import { MessageCircle, Braces, Brackets, ChevronRight, Code, Database, Play, Rocket, Star, Terminal, Wallet, NotebookIcon, TestTube, Layers, Calculator, Activity, Filter, Server, Package, Shield, Zap, Hammer } from 'lucide-react';
+import { API, Backend, BugIcon, Clarinet, Clarity, Cloud, Chainhook, Frontend, Hiro, Js, Newspaper, Pulse, QuestionIcon } from '@/components/ui/icon';
+import heroImage from '@/public/stacks-hero.svg';
+
+
+
+ } tag="Hiro" description="Aprende más sobre las características que ofrecen nuestras herramientas." />
+
+ } tag="Resources" description="Comienza con una colección de recursos seleccionados en todo el ecosistema de Stacks." />
+
+
+
+
+
+
+
+
+ } href="/creating-a-clarinet-project" title="Quiero escribir contratos inteligentes" description="Comienza con la configuración del proyecto y los fundamentos del desarrollo local." />
+
+ } href="/unit-testing" title="Quiero probar mis contratos" description="Aprende las mejores prácticas de pruebas y técnicas de depuración." />
+
+ } href="/contract-monitoring" title="Quiero monitorear datos de blockchain" description="Configura el monitoreo e indexación en tiempo real." />
+
+ } href="/building-transactions" title="Quiero interactuar con contratos" description="Aprende cómo construir y enviar transacciones de forma programática." />
+
+
+
+
+
+
+
+
+
+ } href="/creating-a-clarinet-project" title="Crea Tu Primer Proyecto" description="Configura un nuevo proyecto de Clarinet y comienza a construir contratos inteligentes localmente." />
+
+ } href="/configuring-clarity-vscode-extension" title="Configura Tu IDE" description="Configure VS Code con la extensión Clarity para una experiencia de desarrollo mejorada." />
+
+ } href="/using-local-accounts" title="Administrar Cuentas Locales" description="Trabaja con cuentas y billeteras de prueba en tu entorno de desarrollo local." />
+
+ } href="/working-with-devnet" title="Configuración de Red Local" description="Ejecuta y configura una blockchain local de Stacks para pruebas." />
+
+
+
+
+
+
+
+
+
+ } href="/unit-testing" title="Pruebas Unitarias" description="Escriba pruebas unitarias exhaustivas para asegurarse de que la lógica de su contrato sea correcta." />
+
+ } href="/integration-testing" title="Pruebas de Integración" description="Prueba las interacciones del contrato y los escenarios complejos con pruebas de integración." />
+
+ } href="/cost-analysis-and-debugging" title="Análisis de Costos" description="Analizar los costos de transacción y depurar problemas de rendimiento del contrato." />
+
+
+
+
+
+
+
+
+
+ } href="/contract-monitoring" title="Monitorear Contratos" description="Rastrea la actividad y los eventos de contratos inteligentes en tiempo real." />
+
+ } href="/creating-predicates" title="Crear Filtros de Eventos" description="Construye predicados personalizados para filtrar eventos de blockchain." />
+
+ } href="/building-a-simple-indexer" title="Construir un Indexador" description="Crea tu propio indexador de datos de blockchain para aplicaciones personalizadas." />
+
+ } href="/working-with-events-and-transaction-payloads" title="Cargas útiles de eventos" description="Analiza y trabaja con datos de transacciones y cargas útiles de eventos." />
+
+
+
+
+
diff --git a/content/docs/es/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx b/content/docs/es/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
new file mode 100644
index 000000000..56cdee1b1
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx
@@ -0,0 +1,168 @@
+---
+title: Archivo bootstrap
+description: Sáltese semanas de indexación mediante el arranque desde los archivos preindexados de Hiro.
+---
+## Resumen
+
+En lugar de indexar desde el bloque génesis, puedes iniciar tu indexador utilizando los archivos actualizados regularmente de Hiro. Esto reduce el tiempo de sincronización inicial de semanas a horas.
+
+## Archivos disponibles
+
+Hiro proporciona archivos para diferentes configuraciones:
+
+| Tipo de Archivo | Metaprotocolos | Tamaño | Tiempo de Sincronización |
+|--------------|---------------|------|-----------|
+| Completo | Ordinals, Runes, BRC-20 | ~800 GB | 2-4 horas |
+| Solo Ordinals | Ordinals | ~450 GB | 1-2 horas |
+| Solo Runes | Runes | ~80 GB | 30 minutos |
+| Solo BRC-20 | BRC-20 | ~120 GB | 45 minutos |
+
+## Descargar archivos
+
+### Crear directorio de archivo
+
+```terminal
+$ mkdir -p ~/bitcoin-indexer/archives
+$ cd ~/bitcoin-indexer/archives
+```
+
+### Descargar archivos requeridos
+
+Descarga los archivos para los metaprotocolos que deseas indexar:
+
+```terminal
+$ curl -O -C - https://archive.hiro.so/mainnet/bitcoin-indexer-adhoc/mainnet-bitcoin-indexer-ordinals-pg-latest.tar
+$ curl -O -C - https://archive.hiro.so/mainnet/bitcoin-indexer-adhoc/mainnet-bitcoin-indexer-brc20-pg-latest.tar
+$ curl -O -C - https://archive.hiro.so/mainnet/bitcoin-indexer-adhoc/mainnet-bitcoin-indexer-rocksdb-latest.tar.gz
+$ curl -O -C - https://archive.hiro.so/mainnet/bitcoin-indexer-adhoc/mainnet-bitcoin-indexer-runes-pg-latest.tar
+```
+
+:::callout
+### Tiempo de descarga
+
+Los archivos son grandes (100-800GB). Usar `-C -` bandera para habilitar la reanudación en caso de interrupción. Los tiempos de descarga varían de 2 a 8 horas dependiendo de la velocidad de conexión.
+:::
+
+### Extraer archivos
+
+```terminal
+$ tar -xzf mainnet-bitcoin-indexer-rocksdb-latest.tar.gz
+$ tar -xf mainnet-bitcoin-indexer-ordinals-pg-latest.tar
+$ tar -xf mainnet-bitcoin-indexer-brc20-pg-latest.tar
+$ tar -xf mainnet-bitcoin-indexer-runes-pg-latest.tar
+```
+
+### Mover datos de RocksDB
+
+```terminal
+$ mv rocksdb ~/bitcoin-indexer/rocksdb-chainstate
+```
+
+## Restaurar bases de datos PostgreSQL
+
+### Establecer permisos
+
+```terminal
+$ sudo chown -R postgres:postgres ~/bitcoin-indexer/archives/brc20.dump
+$ sudo chown -R postgres:postgres ~/bitcoin-indexer/archives/ordinals.dump
+$ sudo chown -R postgres:postgres ~/bitcoin-indexer/archives/runes.dump
+```
+
+### Importar volcados de base de datos
+
+Restaure los archivos de PostgreSQL en sus bases de datos:
+
+```terminal
+$ sudo -u postgres pg_restore --verbose --jobs=6 -d ordinals -c --if-exists ~/bitcoin-indexer/archives/ordinals.dump
+
+$ # Restore Runes database (if downloaded)
+$ sudo -u postgres pg_restore --verbose --jobs=6 -d runes -c --if-exists ~/bitcoin-indexer/archives/runes.dump
+```
+
+:::callout
+### Tiempo de restauración
+
+La restauración de la base de datos tarda entre 1 y 4 horas dependiendo del tamaño del archivo y la velocidad del disco. El `--jobs=6` flag utiliza procesamiento paralelo para acelerar la restauración.
+:::
+
+### Verificar restauración
+
+Verifique que los datos se hayan importado correctamente:
+
+```terminal
+$ sudo -u postgres psql -d ordinals -c "SELECT COUNT(*) FROM inscriptions;"
+$ sudo -u postgres psql -d brc20 -c "SELECT COUNT(DISTINCT ticker) FROM tokens;"
+```
+
+## Verificar la altura del bloque de archivo
+
+Encuentra la altura del bloque de tu archivo restaurado:
+
+```terminal
+$ ls -la ~/bitcoin-indexer/rocksdb-chainstate/rocksdb/ | grep -i manifest
+```
+
+## Configuración para el arranque del archivo
+
+¡No se necesita configuración especial! El indexador detecta automáticamente el estado del archivo y continúa desde donde se quedó. Solo asegúrate de que tus rutas coincidan:
+
+```toml title="bitcoin-indexer-config.toml"
+[storage]
+working_dir = "/home/bitcoin-indexer/bitcoin-indexer/rocksdb-chainstate"
+
+# ... rest of your configuration
+```
+
+## Comenzar indexación
+
+Con el archivo en su lugar, inicie el indexador:
+
+```terminal
+$ bitcoin-indexer runes service start --config-path=bitcoin-indexer.toml
+$ bitcoin-indexer ordinals service start --config-path=bitcoin-indexer.toml
+```
+
+El indexador:
+
+1. Cargar el estado del archivo
+2. Conéctese a su nodo de Bitcoin
+3. Procesar nuevos bloques desde la altura del archivo
+4. Alcanzar la punta de la cadena
+
+## Creando archivos personalizados
+
+Exporte sus propios archivos para respaldo o migración:
+
+```terminal
+$ bitcoin-indexer export \
+ --data-dir /data/bitcoin-indexer \
+ --output /backups/indexer-backup.tar.gz \
+ --compress
+```
+
+## Solución de problemas
+
+### Error al extraer el archivo
+
+Asegúrese de tener suficiente espacio en disco - los archivos se extraen temporalmente al doble de su tamaño comprimido.
+
+### Errores de verificación
+
+```terminal
+$ tar -tzf bitcoin-indexer-full-latest.tar.gz | wc -l
+```
+
+### Velocidades de descarga lentas
+
+Utilice un gestor de descargas con soporte de reanudación:
+
+```terminal
+$ aria2c -x 16 -s 16 https://archive.hiro.so/bitcoin-indexer/mainnet/bitcoin-indexer-full-latest.tar.gz
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Configurar el indexador](/tools/bitcoin-indexer/configuration): Ajusta la configuración para tu caso de uso
+* [Comience a usar la API de Ordinals](/tools/bitcoin-indexer/ordinals-api): Ejecutar consultas en sus datos indexados
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/(indexer)/configuration.mdx b/content/docs/es/tools/bitcoin-indexer/(indexer)/configuration.mdx
new file mode 100644
index 000000000..e2ea5834a
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(indexer)/configuration.mdx
@@ -0,0 +1,286 @@
+---
+title: Configuración
+description: Configura el Indexador de Bitcoin para un rendimiento óptimo y personaliza la configuración del metaprotocolo.
+---
+## Archivo de configuración
+
+El Indexador de Bitcoin utiliza un archivo de configuración TOML para controlar todos los aspectos de la operación. Cree el archivo de configuración:
+
+```terminal
+$ nano ~/bitcoin-indexer/bitcoin-indexer/bitcoin-indexer-config.toml
+```
+
+## Ejemplo de configuración completa
+
+```toml title="bitcoin-indexer-config.toml"
+[storage]
+# Path to RocksDB data directory
+working_dir = "/home/bitcoin-indexer/bitcoin-indexer/rocksdb-chainstate"
+
+[metrics]
+# Enable Prometheus metrics
+enabled = true
+prometheus_port = 9153
+
+[ordinals.db]
+# PostgreSQL connection for Ordinals data
+database = "ordinals"
+host = "localhost"
+port = 5432
+username = "postgres"
+password = "postgres"
+
+[ordinals.meta_protocols.brc20]
+# Enable BRC-20 indexing within Ordinals
+enabled = true
+lru_cache_size = 10000
+
+[ordinals.meta_protocols.brc20.db]
+# Separate database for BRC-20 data
+database = "brc20"
+host = "localhost"
+port = 5432
+username = "postgres"
+password = "postgres"
+
+[runes]
+# LRU cache for Runes performance
+lru_cache_size = 10000
+
+[runes.db]
+# PostgreSQL connection for Runes data
+database = "runes"
+host = "localhost"
+port = 5432
+username = "postgres"
+password = "postgres"
+
+[bitcoind]
+# Bitcoin Core connection settings
+network = "mainnet"
+rpc_url = "http://127.0.0.1:8332"
+rpc_username = "user"
+rpc_password = "password"
+zmq_url = "tcp://0.0.0.0:18543"
+
+[resources]
+# Resource allocation
+ulimit = 2048
+cpu_core_available = 6
+memory_available = 16
+bitcoind_rpc_threads = 6
+bitcoind_rpc_timeout = 15
+```
+
+## Secciones de configuración
+
+### Configuración de almacenamiento
+
+Controla dónde el indexador almacena el estado de la blockchain:
+
+```toml
+[storage]
+working_dir = "/path/to/rocksdb-chainstate"
+# Optional: Set RocksDB specific options
+rocksdb_max_open_files = 10000
+rocksdb_cache_size = "8GB"
+```
+
+:::callout
+### Rendimiento del almacenamiento
+
+Utilice almacenamiento NVMe rápido para el directorio de trabajo. El indexador realiza muchas lecturas/escrituras aleatorias durante la operación.
+:::
+
+### Conexiones de base de datos
+
+Cada metaprotocolo puede usar una base de datos separada para aislamiento:
+
+```toml
+[ordinals.db]
+database = "ordinals"
+host = "localhost"
+port = 5432
+username = "postgres"
+password = "postgres"
+# Optional connection pool settings
+max_connections = 50
+min_connections = 10
+connection_timeout = 30
+```
+
+### Conexión de nodo Bitcoin
+
+Configura cómo el indexador se conecta a tu nodo de Bitcoin:
+
+```toml
+[bitcoind]
+network = "mainnet" # or "testnet", "regtest"
+rpc_url = "http://127.0.0.1:8332"
+rpc_username = "user"
+rpc_password = "password"
+zmq_url = "tcp://0.0.0.0:18543"
+# Optional: Custom RPC timeout
+rpc_timeout = 30
+```
+
+### Asignación de recursos
+
+Optimiza el rendimiento según tu hardware:
+
+```toml
+[resources]
+# File descriptor limit
+ulimit = 2048
+
+# CPU cores to use for indexing
+cpu_core_available = 6
+
+# Memory in GB
+memory_available = 16
+
+# Bitcoin RPC connection pool
+bitcoind_rpc_threads = 6
+bitcoind_rpc_timeout = 15
+```
+
+### Configuración específica del metaprotocolo
+
+#### Configuración de ordinales
+
+```toml
+[ordinals]
+# Start indexing from specific height (optional)
+start_block = 767430
+
+# Enable inscription number calculation
+track_numbers = true
+
+# Cursed inscription handling
+index_cursed = true
+
+[ordinals.meta_protocols.brc20]
+enabled = true
+# Cache size for BRC-20 balance calculations
+lru_cache_size = 10000
+# Track all operations or just valid ones
+index_invalid_operations = false
+```
+
+#### Configuración de runas
+
+```toml
+[runes]
+# LRU cache for rune entries
+lru_cache_size = 10000
+
+# Start block for runes (mainnet activation)
+start_block = 840000
+
+# Index unspendable runes
+index_unspendable = true
+```
+
+### Configuración de API
+
+Configurar el servidor de API REST:
+
+```toml
+[api]
+# API server settings
+enabled = true
+port = 3000
+host = "0.0.0.0"
+
+# CORS settings
+cors_enabled = true
+cors_origins = ["*"]
+
+# Rate limiting
+rate_limit_enabled = true
+rate_limit_requests_per_minute = 60
+
+# API key authentication
+require_auth = false
+api_keys = ["your-api-key-here"]
+```
+
+### Configuración de monitoreo
+
+Habilitar métricas y monitoreo:
+
+```toml
+[metrics]
+enabled = true
+prometheus_port = 9153
+
+# Log settings
+[logging]
+level = "info" # debug, info, warn, error
+format = "json" # json or pretty
+directory = "/home/bitcoin-indexer/bitcoin-indexer/logs"
+max_size = "100MB"
+max_backups = 10
+```
+
+## Ajuste de rendimiento
+
+### Para indexación de alto rendimiento
+
+```toml
+[resources]
+cpu_core_available = 16
+memory_available = 32
+bitcoind_rpc_threads = 16
+
+[storage]
+rocksdb_cache_size = "16GB"
+rocksdb_max_open_files = 20000
+
+[ordinals.db]
+max_connections = 100
+```
+
+### Para recursos limitados
+
+```toml
+[resources]
+cpu_core_available = 4
+memory_available = 8
+bitcoind_rpc_threads = 4
+
+[storage]
+rocksdb_cache_size = "2GB"
+rocksdb_max_open_files = 5000
+
+[ordinals.db]
+max_connections = 20
+```
+
+## Variables de entorno
+
+Los valores de configuración pueden ser anulados con variables de entorno:
+
+```bash
+# Override database password
+export BITCOIN_INDEXER_ORDINALS_DB_PASSWORD="secure_password"
+
+# Override RPC credentials
+export BITCOIN_INDEXER_BITCOIND_RPC_USERNAME="myuser"
+export BITCOIN_INDEXER_BITCOIND_RPC_PASSWORD="mypass"
+
+# Override API port
+export BITCOIN_INDEXER_API_PORT="8080"
+```
+
+## Validar configuración
+
+Prueba tu configuración antes de comenzar:
+
+```terminal
+$ bitcoin-indexer validate --config-path=~/bitcoin-indexer/bitcoin-indexer/bitcoin-indexer-config.toml
+[32m✓[0m Configuration valid
+[32m✓[0m Bitcoin node reachable
+[32m✓[0m PostgreSQL databases accessible
+[32m✓[0m Storage directory writable
+```
diff --git a/content/docs/es/tools/bitcoin-indexer/(indexer)/full-sync.mdx b/content/docs/es/tools/bitcoin-indexer/(indexer)/full-sync.mdx
new file mode 100644
index 000000000..d3e98d810
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(indexer)/full-sync.mdx
@@ -0,0 +1,190 @@
+---
+title: Sincronización completa
+sidebarTitle: Sincronización completa
+description: Ejecutar el Indexador de Bitcoin desde cero.
+isNew: true
+---
+import { ArrowRight, Check } from 'lucide-react';
+
+## Lo que aprenderás
+
+:::objectives
+* Configurar e inicializar el Indexador de Bitcoin
+* Ejecutar el indexador desde cero
+* Monitorear el progreso de indexación de manera efectiva
+:::
+
+:::prerequisites
+* Bitcoin Core nodo ejecutándose con `txindex=1`
+* PostgreSQL ejecutándose con bases de datos creadas
+* Espacio de almacenamiento suficiente
+:::
+
+:::callout
+### Archivo bootstrap recomendado
+
+Si aún no lo has hecho, considera [arranque inicial desde archivos](/tools/bitcoin-indexer/archive-bootstrap) para ahorrar días de tiempo de indexación.
+:::
+
+## Iniciar servicios de indexación
+
+El Indexador de Bitcoin ejecuta servicios separados para cada metaprotocolo. Navega a tu directorio del indexador:
+
+```terminal
+$ cd ~/bitcoin-indexer/bitcoin-indexer
+```
+
+### Ordinales de Índice (incluye BRC-20)
+
+```terminal
+$ ./target/release/bitcoin-indexer ordinals service start --config-path=bitcoin-indexer-config.toml
+```
+
+### Runas de Índice
+
+En una terminal separada:
+
+```terminal
+$ ./target/release/bitcoin-indexer runes service start --config-path=bitcoin-indexer-config.toml
+```
+
+:::callout
+type: info
+
+### Compilando desde el código fuente
+
+Si está descargando una versión de nuestro extremo, ejecute `cargo build --release` después de navegar a la carpeta para compilar el proyecto. Este paso es necesario para usar `/target/release/bitcoin-indexer` para iniciar servicios.
+:::
+
+## Monitorear el progreso de indexación
+
+### Revisar los registros del servicio
+
+El indexador genera información detallada sobre el progreso:
+
+```terminal
+$ tail -f ~/bitcoin-indexer/bitcoin-indexer/ordinals.log
+```
+
+### Consultar el estado del indexador a través de la API
+
+Una vez que el servidor API se inicia (generalmente después de unos pocos bloques):
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/status
+{
+ "block_height": 819600,
+ "inscriptions_indexed": 52342567,
+ "latest_inscription_number": 52342567,
+ "sync_percentage": 99.93,
+ "blocks_behind": 523
+}
+```
+
+## Gestión de servicios
+
+### Detener servicios de manera controlada
+
+```terminal
+$ ps aux | grep bitcoin-indexer
+```
+
+### Reiniciar después de la interrupción
+
+El indexador se reanuda automáticamente desde el último bloque procesado:
+
+```terminal
+$ ./target/release/bitcoin-indexer ordinals service start --config-path=bitcoin-indexer-config.toml
+```
+
+## Configuración del servicio systemd
+
+Para implementaciones de producción, utilice systemd para gestionar servicios:
+
+### Crear servicio de Ordinales
+
+```bash title="/etc/systemd/system/bitcoin-indexer-ordinals.service"
+[Unit]
+Description=Bitcoin Indexer - Ordinals Service
+After=network.target postgresql.service bitcoind.service
+
+[Service]
+Type=simple
+User=bitcoin-indexer
+WorkingDirectory=/home/bitcoin-indexer/bitcoin-indexer
+ExecStart=/home/bitcoin-indexer/bitcoin-indexer/target/release/bitcoin-indexer ordinals service start --config-path=bitcoin-indexer-config.toml
+Restart=on-failure
+RestartSec=30
+
+[Install]
+WantedBy=multi-user.target
+```
+
+### Crear servicio de Runas
+
+```bash title="/etc/systemd/system/bitcoin-indexer-runes.service"
+[Unit]
+Description=Bitcoin Indexer - Runes Service
+After=network.target postgresql.service bitcoind.service
+
+[Service]
+Type=simple
+User=bitcoin-indexer
+WorkingDirectory=/home/bitcoin-indexer/bitcoin-indexer
+ExecStart=/home/bitcoin-indexer/bitcoin-indexer/target/release/bitcoin-indexer runes service start --config-path=bitcoin-indexer-config.toml
+Restart=on-failure
+RestartSec=30
+
+[Install]
+WantedBy=multi-user.target
+```
+
+### Habilitar e iniciar servicios
+
+```terminal
+$ sudo systemctl daemon-reload
+$ sudo systemctl enable bitcoin-indexer-ordinals bitcoin-indexer-runes
+$ sudo systemctl start bitcoin-indexer-ordinals bitcoin-indexer-runes
+$ sudo systemctl status bitcoin-indexer-ordinals
+```
+
+## Optimización del rendimiento
+
+### Durante la sincronización inicial
+
+Optimizar el rendimiento durante la puesta al día:
+
+```toml title="bitcoin-indexer-config.toml"
+[resources]
+# Use more cores during initial sync
+cpu_core_available = 12
+bitcoind_rpc_threads = 10
+```
+
+### Después de alcanzar la punta de la cadena
+
+Reducir el uso de recursos para la operación en estado estable:
+
+```toml
+[resources]
+# Reduce for normal operation
+cpu_core_available = 4
+bitcoind_rpc_threads = 4
+```
+
+## Verificar la indexación exitosa
+
+### Verificar puntos finales de API
+
+Prueba que las APIs estén devolviendo datos:
+
+```terminal -o
+$ curl http://localhost:3000/ordinals/v1/inscriptions/0
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Archivos de Hiro](/tools/bitcoin-indexer/archive-bootstrap): Salta semanas de indexación al iniciar desde los archivos preindexados de Hiro.
+* [Configuración avanzada](/tools/bitcoin-indexer/configuration): Configura el Indexador de Bitcoin para un rendimiento óptimo y personaliza la configuración del metaprotocolo.
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/(indexer)/installation.mdx b/content/docs/es/tools/bitcoin-indexer/(indexer)/installation.mdx
new file mode 100644
index 000000000..cda02d783
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(indexer)/installation.mdx
@@ -0,0 +1,224 @@
+---
+title: Instalación
+description: Instale PostgreSQL y compile el Indexador de Bitcoin desde el código fuente en sistemas Linux.
+---
+## Requisitos previos
+
+Antes de instalar el Indexador de Bitcoin, asegúrese de tener:
+
+* Un nodo de Bitcoin completamente sincronizado (ver [Configuración de nodo de Bitcoin](/tools/bitcoin-indexer/full-sync))
+* Ubuntu 20.04+ o Debian 11+
+* Al menos 32GB de RAM
+* 2TB+ de almacenamiento NVMe rápido
+
+Instalar los paquetes del sistema requeridos:
+
+```terminal
+$ sudo apt update
+$ sudo apt install -y build-essential git curl pkg-config libssl-dev
+```
+
+## Instalar PostgreSQL
+
+El Indexador de Bitcoin requiere PostgreSQL 14 o superior para almacenar datos de metaprotocolo.
+
+### Agregar repositorio de PostgreSQL
+
+```terminal
+$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
+$ curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
+$ sudo apt update
+```
+
+### Instalar PostgreSQL 17
+
+```terminal
+$ sudo apt install postgresql-17
+$ echo 'export PATH=/usr/lib/postgresql/17/bin:$PATH' >> ~/.bashrc
+$ source ~/.bashrc
+```
+
+### Configurar el directorio de datos de PostgreSQL
+
+Crear un directorio de datos personalizado para PostgreSQL:
+
+```terminal
+$ mkdir -p ~/bitcoin-indexer/pgdata
+$ sudo chown -R postgres:postgres ~/bitcoin-indexer/pgdata
+```
+
+Inicializar el clúster de base de datos:
+
+```terminal
+$ sudo -u postgres env "PATH=$PATH" initdb -D ~/bitcoin-indexer/pgdata
+[32mThe files belonging to this database system will be owned by user "postgres".[0m
+[32mThis user must also own the server process.[0m
+```
+
+### Iniciar servidor PostgreSQL
+
+```terminal
+$ sudo -u postgres env "PATH=$PATH" pg_ctl -D ~/bitcoin-indexer/pgdata start
+[32mserver starting[0m
+```
+
+Verifique que PostgreSQL esté en ejecución:
+
+```terminal
+$ sudo -u postgres psql -c "SELECT version();"
+```
+
+### Crear bases de datos
+
+Crear bases de datos separadas para cada metaprotocolo:
+
+```terminal
+$ sudo -u postgres createdb -p 5432 ordinals
+$ sudo -u postgres createdb -p 5432 brc20
+$ sudo -u postgres createdb -p 5432 runes
+```
+
+Establece la contraseña del usuario postgres:
+
+```terminal
+$ sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';"
+[32mALTER ROLE[0m
+```
+
+:::callout
+type: warn
+
+### Nota de seguridad
+
+Utilice una contraseña fuerte en producción. La contraseña predeterminada 'postgres' es solo para desarrollo.
+:::
+
+## Instalar Rust
+
+El Indexador de Bitcoin está escrito en Rust. Instale la última versión estable:
+
+```terminal
+$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+$ source $HOME/.cargo/env
+$ rustc --version
+rustc 1.75.0 (82e1608df 2023-12-21)
+```
+
+## Construir Indexador de Bitcoin
+
+### Clonar el repositorio
+
+```terminal
+$ cd ~/bitcoin-indexer
+$ git clone https://github.com/hirosystems/bitcoin-indexer.git
+$ cd bitcoin-indexer
+```
+
+### Compilar desde el código fuente
+
+```terminal
+$ cargo build --release
+ [32mCompiling[0m bitcoin-indexer v0.1.0
+ [32mFinished[0m release [optimized] target(s) in 4m 23s
+```
+
+El binario compilado estará en `target/release/bitcoin-indexer`.
+
+:::callout
+### Tiempo de compilación
+
+La compilación inicial tarda entre 5 y 10 minutos. Las compilaciones posteriores son mucho más rápidas debido al almacenamiento en caché.
+:::
+
+### Crear enlace simbólico para acceso global
+
+```terminal
+$ sudo ln -s ~/bitcoin-indexer/bitcoin-indexer/target/release/bitcoin-indexer /usr/local/bin/bitcoin-indexer
+```
+
+Verificar instalación:
+
+```terminal
+$ bitcoin-indexer --version
+bitcoin-indexer 0.1.0
+```
+
+## Crear estructura de directorios
+
+Configura los directorios necesarios para el indexador:
+
+```terminal
+$ mkdir -p ~/bitcoin-indexer/{rocksdb-chainstate,archives,logs}
+```
+
+Propósitos del directorio:
+
+* `rocksdb-chainstate/` - Almacena el estado indexado de la cadena de bloques
+* `archives/` - Archivos descargados del archivo comprimido para bootstrap
+* `logs/` - Registros de aplicación y errores
+
+## Configurar servicio systemd
+
+Crear un servicio systemd para inicio automático:
+
+```bash title="/etc/systemd/system/bitcoin-indexer.service"
+[Unit]
+Description=Bitcoin Metaprotocol Indexer
+After=network.target postgresql.service bitcoind.service
+
+[Service]
+Type=simple
+User=bitcoin-indexer
+Group=bitcoin-indexer
+WorkingDirectory=/home/bitcoin-indexer/bitcoin-indexer
+
+ExecStart=/usr/local/bin/bitcoin-indexer ordinals service start --config-path=/home/bitcoin-indexer/bitcoin-indexer/bitcoin-indexer-config.toml
+Restart=on-failure
+RestartSec=30
+
+# Process management
+KillMode=mixed
+KillSignal=SIGTERM
+TimeoutStopSec=300
+
+# Security
+NoNewPrivileges=true
+PrivateTmp=true
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Habilitar el servicio:
+
+```terminal
+$ sudo systemctl daemon-reload
+$ sudo systemctl enable bitcoin-indexer
+```
+
+## Verificar instalación
+
+Verifique que todos los componentes estén instalados correctamente:
+
+```terminal
+$ # Check Bitcoin node
+$ bitcoin-cli getblockcount
+820000
+
+$ # Check PostgreSQL
+$ sudo -u postgres psql -l | grep -E "ordinals|brc20|runes"
+ ordinals | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
+ brc20 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
+ runes | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
+
+$ # Check indexer binary
+$ bitcoin-indexer --help
+Bitcoin Indexer - High-performance metaprotocol indexing engine
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Configurar el indexador](/tools/bitcoin-indexer/configuration): Configurar bitcoin-indexer-config.toml
+* [Arranque desde archivos](/tools/bitcoin-indexer/archive-bootstrap): Acelerar la sincronización inicial con datos preindexados
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/(indexer)/node-installation.mdx b/content/docs/es/tools/bitcoin-indexer/(indexer)/node-installation.mdx
new file mode 100644
index 000000000..55c3e6a50
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(indexer)/node-installation.mdx
@@ -0,0 +1,221 @@
+---
+title: Instalación de Node
+description: Configurar y sincronizar un nodo de Bitcoin Core optimizado para el Indexador de Bitcoin.
+---
+## Visión general
+
+El Indexador de Bitcoin requiere un nodo de Bitcoin Core completamente sincronizado con la indexación de transacciones habilitada. Esta guía explica cómo configurar un nodo específicamente configurado para la operación del indexador.
+
+## Descargar Bitcoin Core
+
+Descargue Bitcoin Core versión 25.0 o superior. Elija la versión correcta para la arquitectura de su procesador.
+
+### Crear directorio de Bitcoin
+
+```terminal
+$ mkdir -p ~/bitcoin-indexer/bitcoin
+$ cd ~/bitcoin-indexer/bitcoin
+```
+
+### Descargar y extraer
+
+
+
+
+ Para x86\_64 (Intel/AMD)
+
+
+
+ Para ARM64
+
+
+
+ Instalar globalmente con enlaces simbólicos
+
+
+
+
+ ```terminal
+ $ curl -O https://bitcoincore.org/bin/bitcoin-core-25.1/bitcoin-25.1-x86_64-linux-gnu.tar.gz
+ $ tar -xzf bitcoin-25.1-x86_64-linux-gnu.tar.gz
+ ```
+
+
+
+ ```terminal
+ $ curl -O https://bitcoincore.org/bin/bitcoin-core-25.1/bitcoin-25.1-aarch64-linux-gnu.tar.gz
+ $ tar -xzf bitcoin-25.1-aarch64-linux-gnu.tar.gz
+ ```
+
+
+
+ ```terminal
+ $ sudo ln -s ~/bitcoin-indexer/bitcoin/bitcoin-25.1/bin/bitcoind /usr/local/bin/bitcoind
+ $ sudo ln -s ~/bitcoin-indexer/bitcoin/bitcoin-25.1/bin/bitcoin-cli /usr/local/bin/bitcoin-cli
+ ```
+
+
+
+Verificar instalación:
+
+```terminal
+$ bitcoind --version
+Bitcoin Core version v25.1.0
+```
+
+## Configurar para indexación
+
+### Crear directorio de datos
+
+```terminal
+$ mkdir -p ~/bitcoin-indexer/bitcoin/chainstate
+```
+
+### Crear archivo de configuración
+
+```terminal
+$ nano ~/bitcoin-indexer/bitcoin/bitcoin.conf
+```
+
+Agregue la siguiente configuración:
+
+```console ~/bitcoin-indexer/bitcoin/bitcoin.conf
+# Data directory
+datadir=/home/$USER/bitcoin-indexer/bitcoin/chainstate
+
+# Core settings
+server=1
+txindex=1
+daemon=1
+
+# RPC settings
+rpcuser=user
+rpcpassword=password
+rpcport=8332
+rpcallowip=127.0.0.1
+rpcthreads=16
+
+# ZeroMQ settings (required for indexer)
+zmqpubrawblock=tcp://0.0.0.0:18543
+zmqpubrawtx=tcp://0.0.0.0:18544
+zmqpubhashtx=tcp://0.0.0.0:18545
+zmqpubhashblock=tcp://0.0.0.0:18546
+
+# Performance settings
+# Set to 16384 (16GB) during initial sync, reduce to 2048 after
+dbcache=16384
+maxmempool=1000
+mempoolexpiry=72
+
+# Network settings
+listen=1
+maxconnections=125
+
+# Deprecated RPC
+deprecatedrpc=warnings
+```
+
+:::callout
+type: warn
+
+### Nota de seguridad
+
+Utilice siempre una contraseña fuerte y única para el acceso RPC. El indexador utilizará estas credenciales para comunicarse con su nodo.
+:::
+
+## Sincronización inicial de la cadena de bloques
+
+Inicie Bitcoin Core con su configuración:
+
+```terminal
+$ bitcoind -conf=$HOME/bitcoin-indexer/bitcoin/bitcoin.conf
+```
+
+:::callout
+### Tiempo de sincronización inicial
+
+La sincronización inicial de la cadena de bloques tarda de 1 a 3 días dependiendo del hardware y la velocidad de la red. El nodo descargará aproximadamente 600GB de datos.
+:::
+
+Monitorear el progreso de sincronización en otra terminal:
+
+```terminal
+$ bitcoin-cli -conf=$HOME/bitcoin-indexer/bitcoin/bitcoin.conf getblockchaininfo | jq '{blocks, headers, verificationprogress}'
+```
+
+También puedes monitorear el estado detallado de sincronización:
+
+```terminal
+$ bitcoin-cli -conf=$HOME/bitcoin-indexer/bitcoin/bitcoin.conf getblockchaininfo | jq '{chain, blocks, headers, bestblockhash, verificationprogress, size_on_disk}'
+```
+
+## Verificar la compatibilidad del indexador
+
+Una vez sincronizado, verifique que el nodo esté configurado correctamente:
+
+```terminal -o
+$ bitcoin-cli -conf=$HOME/bitcoin-indexer/bitcoin/bitcoin.conf getindexinfo
+{
+ "txindex": {
+ "synced": true,
+ "best_block_height": 820000
+ }
+}
+$ bitcoin-cli -conf=$HOME/bitcoin-indexer/bitcoin/bitcoin.conf getzmqnotifications
+[
+ {
+ "type": "pubrawblock",
+ "address": "tcp://0.0.0.0:18543",
+ "hwm": 1000
+ },
+ {
+ "type": "pubrawtx",
+ "address": "tcp://0.0.0.0:18544",
+ "hwm": 1000
+ }
+]
+```
+
+## Configuración del servicio systemd
+
+Crear un servicio systemd para inicio automático:
+
+```console /etc/systemd/system/bitcoind.service
+[Unit]
+Description=Bitcoin Core Daemon
+After=network.target
+
+[Service]
+Type=notify
+ExecStart=/usr/local/bin/bitcoind -conf=/home/bitcoin-indexer/bitcoin/bitcoin.conf
+User=bitcoin-indexer
+Group=bitcoin-indexer
+Restart=on-failure
+RestartSec=30
+
+# Security hardening
+NoNewPrivileges=true
+PrivateTmp=true
+ProtectSystem=strict
+ReadWritePaths=/home/bitcoin-indexer/bitcoin/chainstate
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Habilite e inicie el servicio:
+
+```terminal
+$ sudo systemctl enable bitcoind
+$ sudo systemctl start bitcoind
+$ sudo systemctl status bitcoind
+[32m●[0m bitcoind.service - Bitcoin Core Daemon
+ Active: [32mactive (running)[0m
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Configurar el indexador](/tools/bitcoin-indexer/configuration): Configurar el Indexador de Bitcoin para conectarse a tu nodo
+* [Arrancar desde archivo](/tools/bitcoin-indexer/archive-bootstrap): Salta la espera con archivos pre-sincronizados
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx b/content/docs/es/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
new file mode 100644
index 000000000..f68726c0a
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx
@@ -0,0 +1,233 @@
+---
+title: Ejecutando tu propia API de Ordinals
+sidebarTitle: Integración de API de Ordinales
+description: Puntos finales de la API REST para consultar inscripciones de Ordinals, colecciones y rareza de satoshis.
+---
+## Resumen
+
+La API de Ordinals proporciona acceso integral a datos de inscripciones, artefactos digitales y seguimiento de satoshis. Todos los puntos de acceso devuelven JSON y admiten paginación para conjuntos de resultados grandes.
+
+URL base: `http://localhost:3000/ordinals/v1`
+
+## Autenticación
+
+La API está abierta por defecto. Para implementaciones en producción, configure claves de API:
+
+```bash title="bitcoin-indexer.toml"
+[api]
+require_auth = true
+api_keys = ["your-api-key-here"]
+```
+
+Incluya la clave API en las solicitudes:
+
+```bash
+Authorization: Bearer your-api-key-here
+```
+
+## Puntos finales de inscripción
+
+### Obtener inscripción \[#get-inscription]
+
+`GET /inscriptions/{inscription_id}` recupera detalles de inscripción por ID o número.
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/inscriptions/0
+```
+
+```json
+{
+ "id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0",
+ "number": 0,
+ "address": "bc1pxaneaf3w4d27hl2y93fuft2xk6m4u3wc4rafevc6slgd7f5tq2dqynekta",
+ "genesis_address": "bc1pxaneaf3w4d27hl2y93fuft2xk6m4u3wc4rafevc6slgd7f5tq2dqynekta",
+ "genesis_block_height": 767430,
+ "genesis_block_hash": "00000000000000000002a90330a99f67e3f01eb2ce070b45930581e82fb7ddad",
+ "genesis_tx_id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799",
+ "genesis_fee": "0",
+ "genesis_timestamp": 1670913723,
+ "content_type": "text/plain;charset=utf-8",
+ "content_length": 793,
+ "sat_ordinal": "1252201400444387",
+ "sat_rarity": "common",
+ "sat_coinbase_height": 59291
+}
+```
+
+### Lista de inscripciones \[#list-inscriptions]
+
+`GET /inscriptions` devuelve una lista paginada de inscripciones.
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `limit` | número | Resultados por página (máx. 100) |
+| `offset` | número | Número de resultados a omitir |
+| `address` | string | Filtrar por dirección del propietario |
+| `mime_type` | string | Filtrar por tipo MIME |
+| `from_block` | número | Altura del bloque inicial |
+| `to_block` | número | Altura final del bloque |
+
+```terminal
+$ curl "http://localhost:3000/ordinals/v1/inscriptions?limit=5&mime_type=image/png"
+```
+
+### Obtener contenido de inscripción \[#get-content]
+
+`GET /inscriptions/{inscription_id}/content` devuelve el contenido bruto de la inscripción.
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/inscriptions/0/content
+hello world
+```
+
+Para contenido binario (imágenes, etc.), se establecen los encabezados Content-Type apropiados.
+
+## Puntos finales de colección
+
+### Listar colecciones \[#list-collections]
+
+`GET /collections` devuelve colecciones de Ordinals reconocidas.
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/collections
+```
+
+```json
+{
+ "results": [
+ {
+ "id": "bitcoin-punks",
+ "name": "Bitcoin Punks",
+ "inscription_count": 10000,
+ "holder_count": 3847,
+ "floor_price": 15000000,
+ "volume_24h": 580000000
+ }
+ ],
+ "total": 156
+}
+```
+
+### Obtener detalles de la colección \[#get-collection]
+
+`GET /collections/{collection_id}` devuelve metadatos y estadísticas de la colección.
+
+## Puntos finales de Satoshi
+
+### Obtener información de satoshi \[#get-satoshi]
+
+`GET /sats/{ordinal}` devuelve detalles sobre un satoshi específico.
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/sats/1252201400444387
+```
+
+```json
+{
+ "ordinal": "1252201400444387",
+ "decimal": "59291.444387",
+ "rarity": "common",
+ "name": "ntwmwqcqfcb",
+ "block_height": 59291,
+ "offset": 444387,
+ "inscriptions": ["6fb976...42799i0"]
+}
+```
+
+### Lista de rarezas de satoshi \[#list-rarities]
+
+`GET /sats/rarities` devuelve satoshis por clase de rareza.
+
+| Rareza | Descripción |
+|--------|-------------|
+| `mythic` | Primer bloque de génesis |
+| `legendary` | Primer sat de la primera tx en el bloque |
+| `epic` | Primer sábado después del halving |
+| `rare` | Primer sábado después del ajuste de dificultad |
+| `uncommon` | Primer sábado de cada bloque |
+| `common` | Todos los demás sats |
+
+## Puntos finales de actividad
+
+### Obtener actividad reciente \[#recent-activity]
+
+`GET /activity` devuelve transferencias y ventas de inscripciones recientes.
+
+```terminal
+$ curl "http://localhost:3000/ordinals/v1/activity?type=transfer&limit=10"
+```
+
+### Obtener actividad de dirección \[#address-activity]
+
+`GET /addresses/{address}/activity` devuelve la actividad para una dirección específica.
+
+## Puntos finales de estadísticas
+
+### Obtener estadísticas globales \[#global-stats]
+
+`GET /stats` devuelve estadísticas agregadas de Ordinals.
+
+```terminal
+$ curl http://localhost:3000/ordinals/v1/stats
+```
+
+```json
+{
+ "total_inscriptions": 52342891,
+ "total_fees_paid": "4821.23",
+ "unique_mime_types": 847,
+ "holder_addresses": 892341,
+ "inscriptions_24h": 45123,
+ "volume_24h": "18.5"
+}
+```
+
+## Suscripciones de Websocket
+
+Suscríbete a eventos de inscripción en tiempo real:
+
+```javascript
+const ws = new WebSocket('ws://localhost:3000/ordinals/v1/subscribe');
+
+ws.on('message', (data) => {
+ const event = JSON.parse(data);
+ // Handle inscription_revealed, inscription_transferred, etc.
+});
+
+// Subscribe to specific events
+ws.send(JSON.stringify({
+ type: 'subscribe',
+ events: ['inscription_revealed'],
+ filters: { mime_type: 'image/*' }
+}));
+```
+
+## Respuestas de error
+
+Todos los errores devuelven una estructura JSON consistente:
+
+```json
+{
+ "error": {
+ "code": "NOT_FOUND",
+ "message": "Inscription not found",
+ "details": {
+ "inscription_id": "invalid123"
+ }
+ }
+}
+```
+
+| Código | Estado HTTP | Descripción |
+|------|-------------|-------------|
+| `NOT_FOUND` | 404 | Recurso no encontrado |
+| `INVALID_REQUEST` | 400 | Solicitud mal formada |
+| `RATE_LIMITED` | 429 | Demasiadas solicitudes |
+| `INTERNAL_ERROR` | 500 | Error del servidor |
+
+## Próximos pasos
+
+:::next-steps
+* [API de Runas](/tools/bitcoin-indexer/runes-api): Consultar tokens y saldos de Runes
+* [API de Ordinales](/tools/bitcoin-indexer/ordinals-api): Acceder a datos de Ordinales
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/(integrations)/runes-api.mdx b/content/docs/es/tools/bitcoin-indexer/(integrations)/runes-api.mdx
new file mode 100644
index 000000000..b96daed24
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/(integrations)/runes-api.mdx
@@ -0,0 +1,233 @@
+---
+title: Ejecutando tu propia API de Runas
+sidebarTitle: Integración de API de runas
+description: Puntos finales de la API REST para consultar grabados de Runas
+---
+## Visión general
+
+La API de Runes proporciona acceso integral a datos de inscripciones, artefactos digitales y seguimiento de satoshis. Todos los puntos finales devuelven JSON y admiten paginación para conjuntos de resultados grandes.
+
+URL base: `http://localhost:3000/runes/v1`
+
+## Autenticación
+
+La API está abierta por defecto. Para implementaciones en producción, configure claves de API:
+
+```bash title="bitcoin-indexer.toml"
+[api]
+require_auth = true
+api_keys = ["your-api-key-here"]
+```
+
+Incluya la clave API en las solicitudes:
+
+```bash
+Authorization: Bearer your-api-key-here
+```
+
+## Puntos finales de inscripción
+
+### Obtener inscripción \[#get-inscription]
+
+`GET /inscriptions/{inscription_id}` recupera detalles de inscripción por ID o número.
+
+```terminal
+$ curl http://localhost:3000/runes/v1/inscriptions/0
+```
+
+```json
+{
+ "id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0",
+ "number": 0,
+ "address": "bc1pxaneaf3w4d27hl2y93fuft2xk6m4u3wc4rafevc6slgd7f5tq2dqynekta",
+ "genesis_address": "bc1pxaneaf3w4d27hl2y93fuft2xk6m4u3wc4rafevc6slgd7f5tq2dqynekta",
+ "genesis_block_height": 767430,
+ "genesis_block_hash": "00000000000000000002a90330a99f67e3f01eb2ce070b45930581e82fb7ddad",
+ "genesis_tx_id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799",
+ "genesis_fee": "0",
+ "genesis_timestamp": 1670913723,
+ "content_type": "text/plain;charset=utf-8",
+ "content_length": 793,
+ "sat_ordinal": "1252201400444387",
+ "sat_rarity": "common",
+ "sat_coinbase_height": 59291
+}
+```
+
+### Lista de inscripciones \[#list-inscriptions]
+
+`GET /inscriptions` devuelve una lista paginada de inscripciones.
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `limit` | número | Resultados por página (máx. 100) |
+| `offset` | número | Número de resultados a omitir |
+| `address` | string | Filtrar por dirección del propietario |
+| `mime_type` | string | Filtrar por tipo MIME |
+| `from_block` | número | Altura del bloque inicial |
+| `to_block` | número | Altura final del bloque |
+
+```terminal
+$ curl "http://localhost:3000/runes/v1/inscriptions?limit=5&mime_type=image/png"
+```
+
+### Obtener contenido de inscripción \[#get-content]
+
+`GET /inscriptions/{inscription_id}/content` devuelve el contenido bruto de la inscripción.
+
+```terminal
+$ curl http://localhost:3000/runes/v1/inscriptions/0/content
+hello world
+```
+
+Para contenido binario (imágenes, etc.), se establecen los encabezados Content-Type apropiados.
+
+## Puntos finales de colección
+
+### Listar colecciones \[#list-collections]
+
+`GET /collections` devuelve colecciones de Ordinals reconocidas.
+
+```terminal
+$ curl http://localhost:3000/runes/v1/collections
+```
+
+```json
+{
+ "results": [
+ {
+ "id": "bitcoin-punks",
+ "name": "Bitcoin Punks",
+ "inscription_count": 10000,
+ "holder_count": 3847,
+ "floor_price": 15000000,
+ "volume_24h": 580000000
+ }
+ ],
+ "total": 156
+}
+```
+
+### Obtener detalles de la colección \[#get-collection]
+
+`GET /collections/{collection_id}` devuelve metadatos y estadísticas de la colección.
+
+## Puntos finales de Satoshi
+
+### Obtener información de satoshi \[#get-satoshi]
+
+`GET /sats/{ordinal}` devuelve detalles sobre un satoshi específico.
+
+```terminal
+$ curl http://localhost:3000/runes/v1/sats/1252201400444387
+```
+
+```json
+{
+ "ordinal": "1252201400444387",
+ "decimal": "59291.444387",
+ "rarity": "common",
+ "name": "ntwmwqcqfcb",
+ "block_height": 59291,
+ "offset": 444387,
+ "inscriptions": ["6fb976...42799i0"]
+}
+```
+
+### Lista de rarezas de satoshi \[#list-rarities]
+
+`GET /sats/rarities` devuelve satoshis por clase de rareza.
+
+| Rareza | Descripción |
+|--------|-------------|
+| `mythic` | Primer sat del bloque génesis |
+| `legendary` | Primer sat de la primera tx en el bloque |
+| `epic` | Primer sábado después del halving |
+| `rare` | Primer sábado después del ajuste de dificultad |
+| `uncommon` | Primer sábado de cada bloque |
+| `common` | Todos los demás sats |
+
+## Puntos finales de actividad
+
+### Obtener actividad reciente \[#recent-activity]
+
+`GET /activity` devuelve transferencias y ventas de inscripciones recientes.
+
+```terminal
+$ curl "http://localhost:3000/runes/v1/activity?type=transfer&limit=10"
+```
+
+### Obtener actividad de la dirección \[#address-activity]
+
+`GET /addresses/{address}/activity` devuelve la actividad para una dirección específica.
+
+## Puntos finales de estadísticas
+
+### Obtener estadísticas globales \[#global-stats]
+
+`GET /stats` devuelve estadísticas agregadas de Ordinals.
+
+```terminal
+$ curl http://localhost:3000/runes/v1/stats
+```
+
+```json
+{
+ "total_inscriptions": 52342891,
+ "total_fees_paid": "4821.23",
+ "unique_mime_types": 847,
+ "holder_addresses": 892341,
+ "inscriptions_24h": 45123,
+ "volume_24h": "18.5"
+}
+```
+
+## Suscripciones de Websocket
+
+Suscríbete a eventos de inscripción en tiempo real:
+
+```javascript
+const ws = new WebSocket('ws://localhost:3000/runes/v1/subscribe');
+
+ws.on('message', (data) => {
+ const event = JSON.parse(data);
+ // Handle inscription_revealed, inscription_transferred, etc.
+});
+
+// Subscribe to specific events
+ws.send(JSON.stringify({
+ type: 'subscribe',
+ events: ['inscription_revealed'],
+ filters: { mime_type: 'image/*' }
+}));
+```
+
+## Respuestas de error
+
+Todos los errores devuelven una estructura JSON consistente:
+
+```json
+{
+ "error": {
+ "code": "NOT_FOUND",
+ "message": "Inscription not found",
+ "details": {
+ "inscription_id": "invalid123"
+ }
+ }
+}
+```
+
+| Código | Estado HTTP | Descripción |
+|------|-------------|-------------|
+| `NOT_FOUND` | 404 | Recurso no encontrado |
+| `INVALID_REQUEST` | 400 | Solicitud mal formada |
+| `RATE_LIMITED` | 429 | Demasiadas solicitudes |
+| `INTERNAL_ERROR` | 500 | Error del servidor |
+
+## Próximos pasos
+
+:::next-steps
+* [API de Runas](/tools/bitcoin-indexer/runes-api): Consultar tokens y saldos de Runes
+* [API de Ordinales](/tools/bitcoin-indexer/ordinals-api): Acceder a datos de Ordinales
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/index.mdx b/content/docs/es/tools/bitcoin-indexer/index.mdx
new file mode 100644
index 000000000..d15e15f32
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/index.mdx
@@ -0,0 +1,44 @@
+---
+title: Indexador de Bitcoin
+sidebarTitle: Visión general
+description: El Indexador de Bitcoin es un motor de indexación de alto rendimiento, consciente de las reorganizaciones, que rastrea los metaprotocolos de Bitcoin y proporciona puntos finales de API para Ordinals, Runes y tokens BRC-20.
+llm: false
+---
+## Visión general
+
+El Indexador de Bitcoin se conecta a tu nodo de Bitcoin, procesa bloques en tiempo real, almacena datos de metaprotocolos en PostgreSQL y proporciona APIs REST para cada protocolo.
+
+## Características principales
+
+* **Indexación de metaprotocolo** - Soporte integrado para Ordinals, Runes y BRC-20 con arquitectura extensible
+* **Procesamiento consciente de la reorganización** - Maneja automáticamente las bifurcaciones y reorganizaciones de la cadena
+* **Puntos finales de la API REST** - APIs listas para producción para Ordinals y Runes
+* **Arranque inicial del archivo** - Sincronización rápida desde los archivos de Hiro en lugar de indexación completa
+
+## Instalación
+
+```terminal
+$ git clone https://github.com/hirosystems/bitcoin-indexer.git
+$ cd bitcoin-indexer && cargo build --release
+```
+
+Las imágenes de Docker también están disponibles:
+
+```terminal
+$ docker pull hirosystems/bitcoin-indexer:latest
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Instalación de Node](/tools/bitcoin-indexer/node-installation): Configurar y sincronizar un nodo de Bitcoin Core optimizado para el Indexador de Bitcoin.
+* [Sincronización completa](/tools/bitcoin-indexer/full-sync): Ejecutar el indexador desde cero
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda con el Indexador de Bitcoin?
+
+Contáctenos en el #ordinales canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horario de oficina semanal](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/tools/bitcoin-indexer/meta.json b/content/docs/es/tools/bitcoin-indexer/meta.json
new file mode 100644
index 000000000..68985c084
--- /dev/null
+++ b/content/docs/es/tools/bitcoin-indexer/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Bitcoin Indexer",
+ "root": true,
+ "pages": ["---Bitcoin Indexer---", "index", "...(overview)", "...(indexer)"]
+}
diff --git a/content/docs/es/tools/chainhook/(chainhook-cli)/cli-reference.mdx b/content/docs/es/tools/chainhook/(chainhook-cli)/cli-reference.mdx
new file mode 100644
index 000000000..ba69a50c9
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(chainhook-cli)/cli-reference.mdx
@@ -0,0 +1,208 @@
+---
+title: Referencia de CLI
+sidebarTitle: Referencia de CLI
+description: Referencia completa de todos los comandos y opciones de Chainhook CLI.
+---
+El CLI de Chainhook proporciona herramientas para crear, probar e implementar observadores de eventos de blockchain. Desde la creación de predicados hasta la gestión de servicios, Chainhook simplifica su flujo de trabajo de monitoreo de blockchain.
+
+* Generar configuración: [`chainhook config new`](#chainhook-config)
+* Crear predicados: [`chainhook predicates new`](#chainhook-predicates)
+* Probar predicados: [`chainhook predicates scan`](#chainhook-predicates)
+* Ejecutar como un servicio: [`chainhook service start`](#chainhook-service)
+* Administrar la base de datos de Stacks: [`chainhook stacks db`](#chainhook-stacks)
+
+## Gestión de configuración \[#configuration-management]
+
+### configuración de chainhook
+
+`chainhook config` genera archivos de configuración.
+
+| Comando | Descripción |
+|---------|-------------|
+| `new` | Generar nueva configuración |
+
+**Uso con `new`**
+
+```console
+chainhook config new [OPTIONS]
+```
+
+```terminal
+$ chainhook config new --mainnet
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--mainnet` | Red Mainnet objetivo |
+| `--testnet` | Red de prueba objetivo |
+| `--devnet` | Red Devnet objetivo |
+
+## Gestión de predicados \[#predicate-management]
+
+### predicados de chainhook
+
+`chainhook predicates` genera y prueba predicados.
+
+| Comando | Descripción |
+|---------|-------------|
+| `new` | Generar nuevo predicado |
+| `check` | Comprobar predicado dado |
+| `scan` | Escanear bloques (una sola vez) desde la red especificada y aplicar el predicado proporcionado |
+
+**Uso con `new`**
+
+```console
+chainhook predicates new [OPTIONS]
+```
+
+```terminal
+$ chainhook predicates new my-predicate --stacks
+$ chainhook predicates new bitcoin-transfers --bitcoin
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--stacks` | Generar un predicado de Stacks |
+| `--bitcoin` | Generar un predicado de Bitcoin |
+
+**Uso con `scan`**
+
+```console
+chainhook predicates scan [OPTIONS]
+```
+
+```terminal
+$ chainhook predicates scan my-predicate.json --mainnet
+$ chainhook predicates scan transfers.json --testnet --config-path ./Chainhook.toml
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--mainnet` | Red Mainnet objetivo |
+| `--testnet` | Red de prueba objetivo |
+| `--config-path ` | Ruta del archivo de configuración de carga |
+
+**Uso con `check`**
+
+```console
+chainhook predicates check [OPTIONS]
+```
+
+```terminal
+$ chainhook predicates check my-predicate.json --mainnet
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--config-path ` | Ruta del archivo de configuración de carga |
+| `--mainnet` | Red Mainnet objetivo |
+| `--testnet` | Red de prueba objetivo |
+
+## Gestión de servicios \[#service-management]
+
+### servicio chainhook
+
+`chainhook service` ejecuta un servicio que transmite bloques y evalúa predicados registrados.
+
+| Comando | Descripción |
+|---------|-------------|
+| `start` | Iniciar chainhook-cli |
+
+**Uso con `start`**
+
+```console
+chainhook service start [OPTIONS]
+```
+
+```terminal
+$ chainhook service start --config-path=./Chainhook.toml
+$ chainhook service start --predicate-path=./my-predicate.json --mainnet
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--config-path ` | Ruta del archivo de configuración de carga |
+| `--predicate-path ` | Especificar la ruta relativa de los chainhooks (formato yaml) a evaluar |
+| `--start-http-api` | Iniciar API REST para gestionar predicados |
+| `--prometheus-port ` | Si se proporciona, sirve métricas de Prometheus en `localhost:{port}/metrics` |
+| `--mainnet` | Red Mainnet objetivo |
+| `--testnet` | Red de prueba objetivo |
+| `--devnet` | Red Devnet objetivo |
+
+## Integración de Stacks \[#stacks-integration]
+
+### chainhook stacks
+
+`chainhook stacks` proporciona comandos específicos de Stacks.
+
+| Comando | Descripción |
+|---------|-------------|
+| `db` | Comandos relacionados con el mantenimiento de la base de datos |
+
+**Uso con `db`**
+
+```console
+chainhook stacks db
+```
+
+```terminal
+$ chainhook stacks db check
+$ chainhook stacks db update --config-path ./Chainhook.toml
+```
+
+| Subcomando | Descripción |
+|------------|-------------|
+| `check` | Comprobar integridad |
+| `drop` | Actualizar bloques desde la base de datos |
+| `get` | Recuperar un bloque de la base de datos de Stacks |
+| `get-latest` | Obtener los bloques más recientes de la base de datos de bloques no confirmados y confirmados |
+| `unconfirm` | Elimina un bloque de la base de datos de bloques confirmados y lo mueve a la base de datos de bloques no confirmados |
+| `update` | Actualizar la base de datos utilizando el archivo de archivo Stacks más reciente |
+
+| Opción | Descripción |
+|--------|-------------|
+| `--config-path ` | Ruta del archivo de configuración de carga |
+
+## Utilidades \[#utilities]
+
+### documentación de chainhook
+
+`chainhook docs` genera documentación.
+
+| Comando | Descripción |
+|---------|-------------|
+| `api` | Generar nueva documentación para la API de registro de predicados |
+
+**Uso con `api`**
+
+```console
+chainhook docs api
+```
+
+```terminal
+$ chainhook docs api
+```
+
+### chainhook ayuda
+
+`chainhook help` imprime información de ayuda.
+
+**Uso**
+
+```console
+chainhook help [SUBCOMMAND]
+```
+
+```terminal
+$ chainhook help
+$ chainhook help predicates
+```
+
+## Opciones globales \[#global-options]
+
+Estas opciones se pueden utilizar con el comando principal:
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--help` | `-h` | Imprimir información de ayuda |
+| `--version` | `-V` | Imprimir información de versión |
diff --git a/content/docs/es/tools/chainhook/(chainhook-cli)/event-scanning.mdx b/content/docs/es/tools/chainhook/(chainhook-cli)/event-scanning.mdx
new file mode 100644
index 000000000..240cc3259
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(chainhook-cli)/event-scanning.mdx
@@ -0,0 +1,201 @@
+---
+title: Escaneando eventos de blockchain
+sidebarTitle: Escanear eventos
+description: Prueba los predicados escaneando datos históricos de la cadena de bloques antes de implementarlos en producción.
+---
+Esta guía te muestra cómo usar el modo de escaneo de Chainhook para probar predicados contra datos históricos de blockchain. El escaneo ayuda a validar la lógica de tu predicado y entender qué eventos serán capturados antes de entrar en funcionamiento.
+
+## Escaneo básico
+
+Prueba tu predicado contra datos históricos escaneando la cadena de bloques:
+
+```terminal
+$ chainhook predicates scan my-predicate.json --mainnet
+```
+
+El comando scan descarga datos de la cadena de bloques desde Hiro Archive (almacenados en caché después de la primera ejecución) y evalúa tu predicado contra cada bloque en el rango especificado.
+
+### Escanear con redes específicas
+
+```terminal
+$ chainhook predicates scan predicate.json --mainnet
+$ chainhook predicates scan predicate.json --testnet
+$ chainhook predicates scan predicate.json --devnet
+```
+
+## Escaneo de rango de bloques
+
+Limitar el escaneo a bloques específicos para pruebas más rápidas y análisis dirigido:
+
+```terminal
+$ chainhook predicates scan my-predicate.json \
+ --start-block 150000 \
+ --end-block 150100 \
+ --mainnet
+```
+
+### Configurar rangos en predicados
+
+```json block-range-predicate.json
+{
+ "chain": "stacks",
+ "networks": {
+ "mainnet": {
+ "start_block": 150000,
+ "end_block": 151000,
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-dao"
+ }
+ }
+ }
+}
+```
+
+Este predicado escanea solo los bloques 150.000 a 151.000, reduciendo significativamente el tiempo de escaneo.
+
+## Configuración de salida
+
+Controla dónde se escriben los resultados del escaneo usando el `then_that` sección.
+
+### Salida de archivo
+
+```json file-output-predicate.json
+{
+ "then_that": {
+ "file_append": {
+ "path": "./scan-results.json"
+ }
+ }
+}
+```
+
+### Salida de la consola
+
+```json console-output-predicate.json
+{
+ "then_that": {
+ "file_append": {
+ "path": "-" // Writes to stdout
+ }
+ }
+}
+```
+
+## Optimización del rendimiento
+
+Acelera tus escaneos siendo específico sobre lo que estás buscando.
+
+### Utilice ámbitos específicos
+
+```json optimized-scope.json
+{
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-dao",
+ "method": "collateralize-and-mint"
+ }
+}
+```
+
+Apuntar a contratos y métodos específicos escanea mucho más rápido que ámbitos amplios.
+
+### Limitar ocurrencias
+
+```json limited-occurrences.json
+{
+ "networks": {
+ "mainnet": {
+ "expire_after_occurrence": 100,
+ "if_this": {
+ "scope": "nft_event",
+ "actions": ["mint"]
+ }
+ }
+ }
+}
+```
+
+Detener el escaneo después de encontrar 100 eventos coincidentes.
+
+## Patrones de escaneo comunes
+
+Aprende de estos ejemplos prácticos de escaneo de eventos específicos de blockchain.
+
+### Encuentra el primer despliegue del contrato
+
+```json find-deployment.json
+{
+ "chain": "stacks",
+ "networks": {
+ "mainnet": {
+ "expire_after_occurrence": 1,
+ "if_this": {
+ "scope": "contract_deployment",
+ "deployer": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR"
+ }
+ }
+ }
+}
+```
+
+```terminal
+$ chainhook predicates scan find-deployment.json --mainnet
+```
+
+### Recopilar actividad de NFT
+
+```json nft-activity.json
+{
+ "if_this": {
+ "scope": "nft_event",
+ "asset_identifier": "SP32AEEF6WW5Y0NMJ1S8SBSZDAY8R5J32NBZFPKKZ.free-punks-v0::free-punks",
+ "actions": ["mint", "transfer", "burn"]
+ },
+ "then_that": {
+ "file_append": {
+ "path": "./nft-activity.json"
+ }
+ }
+}
+```
+
+### Monitorear transacciones de direcciones
+
+```json address-monitor.json
+{
+ "if_this": {
+ "scope": "stx_event",
+ "actions": ["transfer"],
+ "predicate": {
+ "or": [
+ {
+ "equals": {
+ "sender": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR"
+ }
+ },
+ {
+ "equals": {
+ "recipient": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR"
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+Rastrea todas las transferencias de STX que involucren una dirección específica como remitente o destinatario.
+
+## Escaneo de depuración
+
+Habilitar la salida detallada para entender por qué los eventos coinciden o no coinciden:
+
+```terminal
+$ chainhook predicates scan my-predicate.json --mainnet --verbose
+```
+
+## Lecturas adicionales
+
+* [Despliegue en modo de servicio](/tools/chainhook/service-mode)
+* [Ejemplos de uso](/tools/chainhook/usage)
diff --git a/content/docs/es/tools/chainhook/(chainhook-cli)/service-mode.mdx b/content/docs/es/tools/chainhook/(chainhook-cli)/service-mode.mdx
new file mode 100644
index 000000000..70da52569
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(chainhook-cli)/service-mode.mdx
@@ -0,0 +1,151 @@
+---
+title: Ejecutar Chainhook como un servicio
+sidebarTitle: Modo de servicio
+description: Implementa Chainhook como un servicio para la transmisión de eventos de blockchain en tiempo real con nodos de Bitcoin y Stacks.
+---
+Esta guía te muestra cómo ejecutar Chainhook como un servicio para el monitoreo continuo de eventos de blockchain. Aprenderás cómo configurar Chainhook con nodos de Bitcoin y Stacks, gestionar predicados de forma dinámica y optimizar para implementaciones en producción.
+
+## Configuración básica del servicio
+
+Inicie Chainhook como un servicio utilizando un archivo de configuración:
+
+```terminal
+$ chainhook service start --config-path=./Chainhook.toml
+```
+
+El servicio se conecta a tus nodos de blockchain y comienza a monitorear eventos que coincidan con tus predicados registrados.
+
+### Configuración mínima
+
+```toml Chainhook.toml
+[storage]
+working_dir = "/var/chainhook"
+
+[network]
+mode = "mainnet"
+
+[limits]
+max_number_of_bitcoin_predicates = 100
+max_number_of_stacks_predicates = 10
+```
+
+## Configuración del nodo Bitcoin
+
+Configurar Chainhook para trabajar con un nodo de Bitcoin para monitorear eventos de Bitcoin:
+
+```toml Chainhook.toml
+[network]
+mode = "mainnet"
+bitcoind_rpc_url = "http://localhost:8332"
+bitcoind_rpc_username = "devnet"
+bitcoind_rpc_password = "devnet"
+
+# Option 1: Receive events via ZeroMQ (recommended for Bitcoin-only)
+bitcoind_zmq_url = "tcp://0.0.0.0:18543"
+
+# Option 2: Receive events via Stacks node (if running both chains)
+# stacks_node_rpc_url = "http://localhost:20443"
+```
+
+### Configuración de mapeo de Bitcoin
+
+| bitcoin.conf | Chainhook.toml |
+|--------------|----------------|
+| rpcuser | bitcoind\_rpc\_username |
+| rpcpassword | bitcoind\_rpc\_password |
+| rpcport | bitcoind\_rpc\_url |
+| zmqpubhashblock | bitcoind\_zmq\_url |
+
+## Configuración del nodo Stacks
+
+Para monitorear eventos de Stacks, configure tanto el nodo de Stacks como Chainhook:
+
+### Configuración del nodo Stacks
+
+```toml Stacks.toml
+[node]
+working_dir = "/stacks-blockchain"
+rpc_bind = "0.0.0.0:20443"
+p2p_bind = "0.0.0.0:20444"
+
+[burnchain]
+chain = "bitcoin"
+mode = "mainnet"
+peer_host = "localhost"
+username = "devnet" # Must match bitcoin.conf rpcuser
+password = "devnet" # Must match bitcoin.conf rpcpassword
+rpc_port = 8332 # Must match bitcoin.conf rpcport
+
+[[events_observer]]
+endpoint = "localhost:20455"
+retry_count = 255
+events_keys = ["*"]
+```
+
+### Configuración de Chainhook para Stacks
+
+```toml Chainhook.toml
+[network]
+mode = "mainnet"
+bitcoind_rpc_url = "http://localhost:8332"
+bitcoind_rpc_username = "devnet"
+bitcoind_rpc_password = "devnet"
+stacks_node_rpc_url = "http://localhost:20443"
+stacks_events_ingestion_port = 20455
+```
+
+## Gestión de predicados
+
+Registre predicados con el servicio para comenzar a monitorear eventos específicos.
+
+### Comienza con predicados
+
+```terminal
+$ chainhook service start --predicate-path=my-predicate.json --config-path=Chainhook.toml
+```
+
+### Registro dinámico
+
+Habilite la API HTTP para registrar predicados mientras el servicio está en ejecución:
+
+```toml Chainhook.toml
+[http_api]
+http_port = 20456
+database_uri = "redis://localhost:6379/"
+```
+
+Registrar un nuevo predicado a través de la API:
+
+```terminal
+$ curl -X POST http://localhost:20456/v1/chainhooks \
+ -H "Content-Type: application/json" \
+ -d @predicate.json
+
+{"result":"f8d43129-dba1-4a6c-b368-21426de0f3cd","status":200}
+```
+
+## Monitoreo de servicios
+
+Monitoree la salud y el estado de su servicio Chainhook.
+
+### Chequeo de salud
+
+```terminal
+$ curl http://localhost:20456/health
+```
+
+```json
+{
+ "status": "healthy",
+ "stacks_node": "connected",
+ "bitcoin_node": "connected",
+ "database": "connected",
+ "predicates_active": 3
+}
+```
+
+## Lecturas adicionales
+
+* [Diseño de predicados](/tools/chainhook/usage)
+* [Ámbitos de eventos de Bitcoin](/tools/chainhook/reference/bitcoin-scopes)
+* [Ámbitos de eventos de Stacks](/tools/chainhook/reference/stacks-scopes)
diff --git a/content/docs/es/tools/chainhook/(event-handling)/custom-indexer.mdx b/content/docs/es/tools/chainhook/(event-handling)/custom-indexer.mdx
new file mode 100644
index 000000000..90078bd88
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(event-handling)/custom-indexer.mdx
@@ -0,0 +1,5 @@
+---
+title: Construye un indexador personalizado
+description: Crea tu propio indexador de blockchain con Chainhook.
+---
+Contenido provisional - nueva guía por crear
diff --git a/content/docs/es/tools/chainhook/(event-handling)/example-indexers.mdx b/content/docs/es/tools/chainhook/(event-handling)/example-indexers.mdx
new file mode 100644
index 000000000..e9d132555
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(event-handling)/example-indexers.mdx
@@ -0,0 +1,5 @@
+---
+title: Indexadores de ejemplo
+description: Implementaciones de referencia de indexadores Chainhook.
+---
+Contenido provisional - nueva guía por crear
diff --git a/content/docs/es/tools/chainhook/(event-handling)/payload-handling.mdx b/content/docs/es/tools/chainhook/(event-handling)/payload-handling.mdx
new file mode 100644
index 000000000..34674958d
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(event-handling)/payload-handling.mdx
@@ -0,0 +1,5 @@
+---
+title: Manejo de carga útil
+description: Procesar y manejar las cargas útiles del webhook de Chainhook.
+---
+Contenido provisional - nueva guía por crear
diff --git a/content/docs/es/tools/chainhook/(event-handling)/webhook-setup.mdx b/content/docs/es/tools/chainhook/(event-handling)/webhook-setup.mdx
new file mode 100644
index 000000000..b376507d9
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(event-handling)/webhook-setup.mdx
@@ -0,0 +1,5 @@
+---
+title: Configuración de webhook
+description: Configura puntos finales de webhook para recibir eventos de blockchain.
+---
+Contenido provisional - nueva guía por crear
diff --git a/content/docs/es/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx b/content/docs/es/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
new file mode 100644
index 000000000..d3380f3a6
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx
@@ -0,0 +1,122 @@
+---
+title: Registrar Chainhooks en devnet
+description: En esta guía, aprenderás cómo registrar automáticamente Chainhooks en devnet usando Clarinet.
+---
+## Lo que aprenderás
+
+:::objectives
+* Crear archivos de predicado Chainhook en tu proyecto Clarinet
+* Registrar predicados automáticamente al iniciar devnet
+* Monitorear la ejecución de Chainhook durante el desarrollo local
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Clarinet versión 2.1.0 o superior instalada
+* Un proyecto de Clarinet con contratos inteligentes
+* Comprensión básica de los predicados de Chainhook
+:::
+
+## Registrar Chainhooks en devnet
+
+
+
+ ### Crear archivos de predicado
+
+ Cree sus archivos de predicado Chainhook en el directorio de su proyecto Clarinet. Puede colocarlos en la raíz del proyecto u organizarlos en una carpeta dedicada.
+
+ ```json chainhooks/increment.json
+ {
+ "chain": "stacks",
+ "uuid": "1",
+ "name": "Increment Counter",
+ "version": 1,
+ "networks": {
+ "devnet": {
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter",
+ "method": "increment"
+ },
+ "then_that": {
+ "http_post": {
+ "url": "http://localhost:3000/api/increment",
+ "authorization_header": "Bearer devnet-token"
+ }
+ }
+ }
+ }
+ }
+ ```
+
+ El predicado se activará cada vez que el `increment` el método es llamado en tu contrato de contador.
+
+
+
+ ### Organizar la estructura del proyecto
+
+ Estructure su proyecto con archivos Chainhook en una ubicación lógica. Aquí hay una disposición de proyecto recomendada:
+
+ ```
+ my-project/
+ ├── contracts/
+ │ └── counter.clar
+ ├── chainhooks/
+ │ ├── increment.json
+ │ └── decrement.json
+ ├── tests/
+ │ └── counter.test.ts
+ └── Clarinet.toml
+ ```
+
+ Clarinet descubrirá automáticamente los archivos de predicado en el directorio de su proyecto al iniciar devnet.
+
+
+
+ ### Iniciar devnet con registro de Chainhook
+
+ Inicie devnet desde la raíz de su proyecto. Clarinet inicia automáticamente un servicio Chainhook y registra todos los archivos de predicado que encuentra.
+
+ ```terminal
+ $ clarinet devnet start
+ ```
+
+ Busque la confirmación de registro en la salida de su terminal:
+
+ ```console
+ Computing deployment plan
+ ✔ Deployment plan completed
+
+ INFO Feb 5 15:20:07.233382 2 chainhooks registered
+ ```
+
+ Este mensaje confirma que sus predicados están activos y monitoreando la cadena de bloques local.
+
+
+
+ ### Verificar la ejecución de Chainhook
+
+ Interactúe con sus contratos para activar los Chainhooks registrados. Supervise la terminal de devnet para obtener confirmaciones de ejecución.
+
+ ```terminal
+ $ clarinet console
+ >> (contract-call? .counter increment)
+ ```
+
+ Observa la terminal de devnet para ver los hooks activados:
+
+ ```console
+ INFO Feb 5 15:21:07.233382 1 hooks triggered
+ ```
+
+ Su punto final de webhook o salida de archivo recibirá la carga útil del evento según su `then_that` configuración.
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Alcances de Bitcoin](/tools/chainhook/reference/bitcoin-scopes): Explora los tipos de eventos disponibles para Bitcoin
+* [Ámbitos de pilas](/tools/chainhook/reference/stacks-scopes): Explora los tipos de eventos disponibles para Stacks
+:::
diff --git a/content/docs/es/tools/chainhook/(overview)/quickstart.mdx b/content/docs/es/tools/chainhook/(overview)/quickstart.mdx
new file mode 100644
index 000000000..8700e8e37
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(overview)/quickstart.mdx
@@ -0,0 +1,100 @@
+---
+title: Inicio rápido
+description: En esta guía, crearás tu primer predicado Chainhook para monitorear transferencias de STX en la blockchain de Stacks.
+---
+## Lo que aprenderás
+
+:::objectives
+* Cómo crear un predicado Chainhook para rastrear transferencias de STX
+* Cómo escanear datos históricos de blockchain utilizando Chainhook
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Para instrucciones de instalación, visite el [Guía de instalación de Chainhook](/tools/chainhook#installation).
+:::
+
+## Inicio rápido
+
+
+
+ ### Generar un archivo de predicado
+
+ Chainhook utiliza predicados para definir qué eventos de la cadena de bloques se deben rastrear. Genere un archivo de predicado de plantilla:
+
+ ```terminal
+ $ chainhook predicates new stx-transfer.json --stacks
+ ```
+
+ Esto crea un archivo JSON de plantilla con la estructura básica del predicado. El `--stacks` flag especifica que estás rastreando eventos de Stacks (usa `--bitcoin` para Bitcoin).
+
+
+
+ ### Configurar el seguimiento de eventos
+
+ Abrir `stx-transfer.json` y actualizar el `if_this` sección para rastrear eventos de transferencia de STX:
+
+ ```json stx-transfer.json
+ {
+ "chain": "stacks",
+ "uuid": "87ac9bff-1052-4d02-9c79-3768a6f08a09",
+ "name": "STX Transfer",
+ "version": 1,
+ "networks": {
+ "mainnet": {
+ "start_block": 154670,
+ "if_this": {
+ "scope": "stx_event",
+ "actions": ["transfer"]
+ },
+ "then_that": {
+ "file_append": {
+ "path": "stx-transfers.txt"
+ }
+ }
+ }
+ }
+ }
+ ```
+
+ Este predicado:
+
+ * Rastrea todos los eventos de transferencia de STX (`scope: "stx_event"`, `actions: ["transfer"]`)
+ * Comience a escanear desde el bloque 154670
+ * Agregar eventos coincidentes a `stx-transfers.txt`
+
+
+
+ ### Escanear eventos
+
+ Ejecute el comando de escaneo para buscar datos históricos de la cadena de bloques:
+
+ ```terminal
+ $ chainhook predicates scan stx-transfer.json --mainnet
+ ```
+
+ :::callout
+ El primero `scan` descarga un archivo de estado de cadena desde el Archivo Hiro. Los escaneos posteriores utilizan los datos almacenados en caché para un rendimiento más rápido.
+ :::
+
+
+
+ ### Ver resultados
+
+ Verifique el archivo de salida para ver los eventos de transferencia:
+
+ ```terminal
+ $ head -5 stx-transfers.txt
+ ```
+
+ Cada línea contiene una carga útil JSON con detalles de transferencia que incluyen remitente, destinatario, cantidad e información del bloque.
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Diseñar predicados personalizados](/tools/chainhook/usage): Aprende a crear predicados para llamadas de contratos, transferencias de NFT y más
+* [Ejecutar Chainhook como un servicio](/tools/chainhook/service-mode): Configurar monitoreo continuo de blockchain con entrega por webhook
+:::
diff --git a/content/docs/es/tools/chainhook/(overview)/usage.mdx b/content/docs/es/tools/chainhook/(overview)/usage.mdx
new file mode 100644
index 000000000..c65d88099
--- /dev/null
+++ b/content/docs/es/tools/chainhook/(overview)/usage.mdx
@@ -0,0 +1,264 @@
+---
+title: Ejemplos de uso
+sidebarTitle: Uso
+description: Aprende la funcionalidad central de Chainhook a través de ejemplos prácticos - predicados, ámbitos de eventos, manejo de reorganizaciones y modos de operación.
+---
+## Predicados
+
+Los predicados son especificaciones JSON que indican a Chainhook qué eventos de blockchain monitorear y cómo responder. Siguen un patrón de si-esto-entonces-aquello.
+
+```json stx-transfer-predicate.json
+{
+ "chain": "stacks",
+ "uuid": "1",
+ "name": "Monitor STX Transfers",
+ "version": 1,
+ "networks": {
+ "mainnet": {
+ "if_this": {
+ "scope": "stx_event",
+ "actions": ["transfer"]
+ },
+ "then_that": {
+ "http_post": {
+ "url": "https://api.example.com/stx-transfers",
+ "authorization_header": "Bearer secret-token"
+ }
+ },
+ "start_block": 100000
+ }
+ }
+}
+```
+
+Este predicado monitorea todos los eventos de transferencia de STX a partir del bloque 100,000 y los envía a tu punto final de webhook.
+
+### Componentes del predicado
+
+```json
+{
+ "chain": "bitcoin", // Target blockchain: "bitcoin" or "stacks"
+ "uuid": "unique-id-123", // Unique identifier for tracking
+ "name": "My Bitcoin Monitor", // Human-readable name
+ "version": 1, // Predicate version
+ "networks": { // Network-specific configurations
+ "mainnet": { ... },
+ "testnet": { ... }
+ }
+}
+```
+
+## Ámbitos de eventos
+
+Cada blockchain admite diferentes tipos de eventos. Los ámbitos definen qué eventos específicos coincidirán con tu predicado.
+
+### Eventos de Stacks
+
+```json contract-call-predicate.json
+{
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v2-3",
+ "method": "update-price"
+ }
+}
+```
+
+Monitorea llamadas a funciones específicas de contratos. Ámbitos de Stacks disponibles:
+
+* `stx_event` - Transferencias de STX, acuñaciones, quemas
+* `contract_call` - Llamadas a funciones de contratos inteligentes
+* `contract_deployment` - Nuevos despliegues de contratos
+* `print_event` - Declaraciones de impresión del contrato
+* `ft_event` - Operaciones de tokens fungibles
+* `nft_event` - Operaciones de tokens no fungibles
+
+### Eventos de Bitcoin
+
+```json bitcoin-ordinals-predicate.json
+{
+ "if_this": {
+ "scope": "ordinals_protocol",
+ "operation": "inscription_feed"
+ }
+}
+```
+
+Rastrea inscripciones ordinales de Bitcoin. Ámbitos de Bitcoin disponibles:
+
+* `p2pkh`, `p2sh`, `p2wpkh`, `p2tr` - Tipos de dirección
+* `ordinals_protocol` - Inscripciones ordinales
+* `stacks_protocol` - Operaciones de Bitcoin específicas de Stacks
+
+## Manejadores de acciones
+
+Define cómo Chainhook responde cuando los eventos coinciden con tus criterios de predicado.
+
+### Entrega de webhook
+
+```json webhook-config.json
+{
+ "then_that": {
+ "http_post": {
+ "url": "https://api.myapp.com/events",
+ "authorization_header": "Bearer ${WEBHOOK_SECRET}"
+ }
+ }
+}
+```
+
+Chainhook envía eventos coincidentes a tu endpoint mediante POST con el encabezado de autorización.
+
+### Salida de archivo
+
+```json file-output-config.json
+{
+ "then_that": {
+ "file_append": {
+ "path": "/data/blockchain-events.jsonl"
+ }
+ }
+}
+```
+
+Agregar eventos a un archivo local, un objeto JSON por línea.
+
+## Reorganizaciones de blockchain
+
+Chainhook maneja automáticamente las reorganizaciones de la cadena de bloques (reorgs) enviando eventos tanto de retroceso como de aplicación.
+
+```json reorg-event.json
+{
+ "apply": [
+ {
+ "block_identifier": {
+ "index": 792101,
+ "hash": "0x123..."
+ },
+ "transactions": [
+ // New canonical chain transactions
+ ]
+ }
+ ],
+ "rollback": [
+ {
+ "block_identifier": {
+ "index": 792100,
+ "hash": "0x456..."
+ },
+ "transactions": [
+ // Transactions to rollback
+ ]
+ }
+ ]
+}
+```
+
+Su aplicación debe manejar ambos tipos de eventos para mantener la consistencia de los datos durante las reorganizaciones.
+
+### Manejo de eventos de reorganización
+
+```typescript webhook-handler.ts
+app.post('/chainhook-events', (req, res) => {
+ const { apply, rollback } = req.body;
+
+ // First, rollback orphaned transactions
+ if (rollback) {
+ for (const block of rollback) {
+ await removeTransactions(block.transactions);
+ }
+ }
+
+ // Then apply new canonical transactions
+ if (apply) {
+ for (const block of apply) {
+ await processTransactions(block.transactions);
+ }
+ }
+
+ res.status(200).send('OK');
+});
+```
+
+## Modos de operación
+
+Chainhook opera en dos modos principales según su caso de uso.
+
+### Modo de escaneo
+
+Analiza datos históricos de blockchain escaneando bloques archivados:
+
+```terminal
+$ chainhook predicates scan my-predicate.json --mainnet
+```
+
+Utiliza el modo de escaneo para:
+
+* Probando predicados antes del despliegue
+* Analizando eventos pasados de blockchain
+* Rellenando datos históricos
+
+### Modo de servicio
+
+Monitorea eventos de blockchain en vivo en tiempo real:
+
+```terminal
+$ chainhook service start --config-path=config.toml
+```
+
+```toml config.toml
+[http_api]
+http_port = 20456
+database_uri = "redis://localhost:6379"
+
+[network]
+mode = "mainnet"
+bitcoind_rpc_url = "http://localhost:8332"
+stacks_node_rpc_url = "http://localhost:20443"
+```
+
+El modo de servicio mantiene conexiones persistentes con los nodos de la cadena de bloques y procesa nuevos bloques a medida que llegan.
+
+## Configuración de red
+
+Configura los predicados de manera diferente para cada entorno de red:
+
+```json multi-network-predicate.json
+{
+ "networks": {
+ "mainnet": {
+ "start_block": 100000,
+ "if_this": {
+ "scope": "stx_event",
+ "actions": ["transfer", "mint"]
+ }
+ },
+ "testnet": {
+ "start_block": 1,
+ "decode_clarity_values": true,
+ "include_proof": true,
+ "if_this": {
+ "scope": "print_event"
+ }
+ }
+ }
+}
+```
+
+### Opciones de configuración
+
+```json
+{
+ "start_block": 100000, // Begin scanning from this block
+ "end_block": 200000, // Stop at this block (optional)
+ "expire_after_occurrence": 5000, // Stop after N matches
+ "decode_clarity_values": true, // Decode Clarity data types
+ "include_proof": false, // Include merkle proofs
+ "include_contract_abi": true // Include contract interfaces
+}
+```
+
+## Lecturas adicionales
+
+* [Diseñar predicados](/tools/chainhook/usage)
+* [Ejecutar Chainhook como un servicio](/tools/chainhook/service-mode)
diff --git a/content/docs/es/tools/chainhook/index.mdx b/content/docs/es/tools/chainhook/index.mdx
new file mode 100644
index 000000000..c79464f23
--- /dev/null
+++ b/content/docs/es/tools/chainhook/index.mdx
@@ -0,0 +1,56 @@
+---
+title: Chainhook
+sidebarTitle: Visión general
+description: Chainhook es un indexador consciente de las reorganizaciones que proporciona datos confiables de blockchain para Bitcoin y Stacks.
+llm: false
+---
+## Visión general
+
+Chainhook es un indexador consciente de las reorganizaciones que te permite construir flujos de eventos personalizados de las cadenas de bloques de Bitcoin y Stacks. A diferencia de los indexadores tradicionales, Chainhook maneja automáticamente las reorganizaciones de la cadena de bloques, asegurando que tus datos se mantengan precisos sin necesidad de reindexación manual.
+
+Para explorar las características de Chainhook con IA, copie y pegue [llms.txt](/tools/chainhook/llms.txt) en tu LLM de elección.
+
+
+
+## Características principales
+
+* **Indexación consciente de la reorganización** - Maneja automáticamente las bifurcaciones y reorganizaciones de la cadena de bloques
+* **Predicados si-esto-entonces-aquello** - Definir lógica personalizada para activar acciones en eventos específicos de la blockchain
+* **Soporte para múltiples cadenas** - Funciona con las cadenas de bloques de Bitcoin y Stacks
+* **Desarrollo local** - Probar predicados contra datos históricos de la cadena de bloques
+
+## Instalación
+
+
+ ```terminal !! macOS
+ $ brew install chainhook
+ ```
+
+ ```terminal !! Linux
+ $ sudo snap install chainhook
+ ```
+
+ ```terminal !! Windows
+ $ winget install HiroSystems.Chainhook
+ ```
+
+ ```terminal !! Cargo
+ $ git clone https://github.com/hirosystems/chainhook.git
+ $ cd chainhook && cargo chainhook-install
+ ```
+
+
+## Próximos pasos
+
+:::next-steps
+* [Inicio rápido](/tools/chainhook/quickstart): Comienza con Chainhook.
+* [Registrar chainhooks localmente](/tools/chainhook/register-chainhooks-on-devnet): Registrar chainhooks en tu blockchain local.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con Chainhook?
+
+Contáctenos en el **#chainhook** canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horario de oficina semanal](https://www.addevent.com/event/oL21905919) llamada todos los jueves a las 11 am ET.
+:::
diff --git a/content/docs/es/tools/chainhook/meta.json b/content/docs/es/tools/chainhook/meta.json
new file mode 100644
index 000000000..4ce4bb6a9
--- /dev/null
+++ b/content/docs/es/tools/chainhook/meta.json
@@ -0,0 +1,15 @@
+{
+ "title": "Chainhook",
+ "root": true,
+ "pages": [
+ "---Chainhook---",
+ "index",
+ "...(overview)",
+ "---Chainhook CLI---",
+ "...(chainhook-cli)",
+ "---Integrations---",
+ "...(integrations)",
+ "---Reference---",
+ "...reference"
+ ]
+}
diff --git a/content/docs/es/tools/chainhook/reference/bitcoin-scopes.mdx b/content/docs/es/tools/chainhook/reference/bitcoin-scopes.mdx
new file mode 100644
index 000000000..1d9554c91
--- /dev/null
+++ b/content/docs/es/tools/chainhook/reference/bitcoin-scopes.mdx
@@ -0,0 +1,280 @@
+---
+title: Alcances de Bitcoin
+sidebarTitle: Alcances de Bitcoin
+description: Referencia para todos los ámbitos de eventos de Bitcoin disponibles en los predicados de Chainhook.
+---
+Los alcances de Bitcoin definen el `if_this` condiciones en sus predicados de Chainhook. Cada tipo de alcance monitorea eventos específicos en cadena en la cadena de bloques de Bitcoin.
+
+## txid \[#txid]
+
+`txid` coincide las transacciones por su ID de transacción.
+
+### Firma
+
+```json
+{
+ "scope": "txid",
+ "equals": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `equals` | string | Sí | ID de transacción codificado en hexadecimal de 32 bytes para coincidir |
+
+### Ejemplo
+
+```json
+{
+ "if_this": {
+ "scope": "txid",
+ "equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"
+ }
+}
+```
+
+## salidas \[#outputs]
+
+`outputs` compara transacciones basadas en sus scripts de salida.
+
+### Operaciones disponibles
+
+| Operación | Descripción |
+|-----------|-------------|
+| `op_return` | Datos incrustados en transacciones |
+| `p2pkh` | Salidas de Pago-a-Hash-de-Clave-Pública |
+| `p2sh` | Salidas Pay-to-Script-Hash |
+| `p2wpkh` | Salidas de Pago-a-Hash-de-Clave-Pública-Testigo |
+| `p2wsh` | Salidas Pay-to-Witness-Script-Hash |
+| `descriptor` | Descriptores de salida para la derivación de direcciones |
+
+### op\_return
+
+```json
+{
+ "scope": "outputs",
+ "op_return": {
+ "equals" | "starts_with" | "ends_with": string
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `equals` | cadena | No\* | Coincidir datos exactos |
+| `starts_with` | cadena | No\* | Prefijo de datos coincidentes |
+| `ends_with` | cadena | No\* | Sufijo de datos coincidentes |
+
+\*Uno de estos parámetros es obligatorio
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "op_return": {
+ "starts_with": "0xbtc2100"
+ }
+ }
+}
+```
+
+### p2pkh
+
+```json
+{
+ "scope": "outputs",
+ "p2pkh": {
+ "equals": string
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `equals` | string | Sí | Dirección de Bitcoin a coincidir |
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "p2pkh": {
+ "equals": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
+ }
+ }
+}
+```
+
+### p2sh
+
+```json
+{
+ "scope": "outputs",
+ "p2sh": {
+ "equals": string
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `equals` | string | Sí | Dirección de hash de script a coincidir |
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "p2sh": {
+ "equals": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy"
+ }
+ }
+}
+```
+
+### p2wpkh
+
+```json
+{
+ "scope": "outputs",
+ "p2wpkh": {
+ "equals": string
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `equals` | string | Sí | Dirección SegWit nativa para coincidir |
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "p2wpkh": {
+ "equals": "bc1qexampleaddress"
+ }
+ }
+}
+```
+
+### p2wsh
+
+```json
+{
+ "scope": "outputs",
+ "p2wsh": {
+ "equals": string
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `equals` | string | Sí | Dirección de script SegWit nativa para coincidir |
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "p2wsh": {
+ "equals": "bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3"
+ }
+ }
+}
+```
+
+### descriptor
+
+```json
+{
+ "scope": "outputs",
+ "descriptor": {
+ "expression": string,
+ "range": [number, number]
+ }
+}
+```
+
+| Parámetro | Tipo | Obligatorio | Descripción |
+|-----------|------|-------------|-------------|
+| `expression` | string | Sí | Cadena descriptora de salida |
+| `range` | array | Sí | Rango de índices para derivar \[inicio, fin] |
+
+```json
+{
+ "if_this": {
+ "scope": "outputs",
+ "descriptor": {
+ "expression": "wpkh(xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/0/*)",
+ "range": [0, 10]
+ }
+ }
+}
+```
+
+Esto monitorea las direcciones derivadas del índice 0 al 10 de la clave pública extendida proporcionada.
+
+## stacks\_protocol \[#stacks\_protocol]
+
+`stacks_protocol` coincide con transacciones de Bitcoin relacionadas con operaciones de Prueba de Transferencia de Stacks.
+
+### Firma
+
+```json
+{
+ "scope": "stacks_protocol",
+ "operation": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `operation` | string | Sí | Tipo de operación PoT a coincidir |
+
+### Operaciones disponibles
+
+| Operación | Descripción |
+|-----------|-------------|
+| `block_committed` | Compromisos de bloque de Stacks |
+| `leader_registered` | Registros de líderes mineros |
+| `inscription_feed` | Eventos de inscripción ordinal |
+| `stx_transferred` | Transferencias de tokens STX |
+| `stx_locked` | Eventos de bloqueo de tokens STX |
+
+### Ejemplos
+
+#### Monitorear los compromisos de bloque
+
+```json
+{
+ "if_this": {
+ "scope": "stacks_protocol",
+ "operation": "block_committed"
+ }
+}
+```
+
+#### Seguimiento de transferencias de STX
+
+```json
+{
+ "if_this": {
+ "scope": "stacks_protocol",
+ "operation": "stx_transferred"
+ }
+}
+```
+
+#### Monitorear eventos de inscripción
+
+```json
+{
+ "if_this": {
+ "scope": "stacks_protocol",
+ "operation": "inscription_feed"
+ }
+}
+```
diff --git a/content/docs/es/tools/chainhook/reference/stacks-scopes.mdx b/content/docs/es/tools/chainhook/reference/stacks-scopes.mdx
new file mode 100644
index 000000000..355b479a0
--- /dev/null
+++ b/content/docs/es/tools/chainhook/reference/stacks-scopes.mdx
@@ -0,0 +1,350 @@
+---
+title: Ámbitos de pilas
+sidebarTitle: Ámbitos de pilas
+description: Referencia para todos los ámbitos de eventos de Stacks disponibles en los predicados de Chainhook.
+---
+Las áreas de alcance de Stacks definen el `if_this` condiciones en sus predicados de Chainhook. Cada tipo de alcance monitorea eventos específicos en cadena en la blockchain de Stacks.
+
+## txid \[#txid]
+
+`txid` coincide las transacciones por su ID de transacción.
+
+### Firma
+
+```json
+{
+ "scope": "txid",
+ "equals": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `equals` | string | Sí | ID de transacción codificado en hexadecimal de 32 bytes para coincidir |
+
+### Ejemplo
+
+```json
+{
+ "if_this": {
+ "scope": "txid",
+ "equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"
+ }
+}
+```
+
+## altura\_del\_bloque \[#block\_height]
+
+`block_height` coincide con los bloques por su altura.
+
+### Firma
+
+```json
+{
+ "scope": "block_height",
+ "equals" | "higher_than" | "lower_than" | "between": value
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `equals` | entero | No\* | Coincide con la altura exacta del bloque |
+| `higher_than` | entero | No\* | Coincide con bloques por encima de la altura |
+| `lower_than` | entero | No\* | Coincide con bloques por debajo de la altura |
+| `between` | \[entero, entero] | No\* | Coincide con bloques en el rango \[inicio, fin] |
+
+\*Uno de estos parámetros es obligatorio
+
+### Ejemplos
+
+#### Igualar altura exacta
+
+```json
+{
+ "if_this": {
+ "scope": "block_height",
+ "equals": 141200
+ }
+}
+```
+
+#### Coincidir rango de bloques
+
+```json
+{
+ "if_this": {
+ "scope": "block_height",
+ "between": [100000, 110000]
+ }
+}
+```
+
+## ft\_transfer \[#ft\_transfer]
+
+`ft_transfer` coincide con eventos de tokens fungibles.
+
+### Firma
+
+```json
+{
+ "scope": "ft_transfer",
+ "asset_identifier": string,
+ "actions": string[]
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `asset_identifier` | cadena | Sí | Identificador de token completamente calificado |
+| `actions` | string\[] | Sí | Acciones de token: `mint`, `transfer`, `burn` |
+
+### Ejemplos
+
+#### Monitorear transferencias de tokens
+
+```json
+{
+ "if_this": {
+ "scope": "ft_transfer",
+ "asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc",
+ "actions": ["transfer"]
+ }
+}
+```
+
+#### Rastrea todas las actividades de tokens
+
+```json
+{
+ "if_this": {
+ "scope": "ft_transfer",
+ "asset_identifier": "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-10-token::token",
+ "actions": ["mint", "transfer", "burn"]
+ }
+}
+```
+
+## nft\_transfer \[#nft\_transfer]
+
+`nft_transfer` coincide con eventos de tokens no fungibles.
+
+### Firma
+
+```json
+{
+ "scope": "nft_transfer",
+ "asset_identifier": string,
+ "actions": string[]
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `asset_identifier` | string | Sí | Identificador NFT completamente calificado |
+| `actions` | string\[] | Sí | Acciones NFT: `mint`, `transfer`, `burn` |
+
+### Ejemplos
+
+#### Monitorear acuñaciones de NFT
+
+```json
+{
+ "if_this": {
+ "scope": "nft_transfer",
+ "asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys",
+ "actions": ["mint"]
+ }
+}
+```
+
+#### Rastrea todas las actividades de NFT
+
+```json
+{
+ "if_this": {
+ "scope": "nft_transfer",
+ "asset_identifier": "SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.megapont-ape-club::apes",
+ "actions": ["mint", "transfer", "burn"]
+ }
+}
+```
+
+## stx\_transfer \[#stx\_transfer]
+
+`stx_transfer` coincide con eventos de token STX.
+
+### Firma
+
+```json
+{
+ "scope": "stx_transfer",
+ "actions": string[]
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `actions` | string\[] | Sí | Acciones STX: `mint`, `transfer`, `burn`, `lock` |
+
+### Ejemplos
+
+#### Monitorear transferencias STX
+
+```json
+{
+ "if_this": {
+ "scope": "stx_transfer",
+ "actions": ["transfer"]
+ }
+}
+```
+
+#### Rastrea todas las actividades de STX
+
+```json
+{
+ "if_this": {
+ "scope": "stx_transfer",
+ "actions": ["mint", "transfer", "burn", "lock"]
+ }
+}
+```
+
+## print\_event \[#print\_event]
+
+`print_event` coincide con los eventos de impresión del contrato.
+
+### Firma
+
+```json
+{
+ "scope": "print_event",
+ "contract_identifier": string,
+ "contains" | "matches_regex": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `contract_identifier` | string | Sí | Identificador de contrato completamente calificado |
+| `contains` | cadena | No\* | Coincide con eventos que contienen la cadena |
+| `matches_regex` | cadena | No\* | Coincidencia de eventos por patrón regex |
+
+\*Uno de estos parámetros es obligatorio
+
+### Ejemplos
+
+#### Coincidencia por subcadena
+
+```json
+{
+ "if_this": {
+ "scope": "print_event",
+ "contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09",
+ "contains": "monkey"
+ }
+}
+```
+
+#### Coincidencia por patrón de expresión regular
+
+```json
+{
+ "if_this": {
+ "scope": "print_event",
+ "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-dao",
+ "matches_regex": "vault-liquidated-.*"
+ }
+}
+```
+
+## contract\_call \[#contract\_call]
+
+`contract_call` coincide con llamadas a funciones de contrato específicas.
+
+### Firma
+
+```json
+{
+ "scope": "contract_call",
+ "contract_identifier": string,
+ "method": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `contract_identifier` | cadena | Sí | Identificador de contrato completamente calificado |
+| `method` | string | Sí | Nombre del método del contrato |
+
+### Ejemplo
+
+```json
+{
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "SP000000000000000000002Q6VF78.pox",
+ "method": "stack-stx"
+ }
+}
+```
+
+## despliegue\_de\_contrato \[#despliegue\_de\_contrato]
+
+`contract_deployment` coincide con las implementaciones de contratos.
+
+### Firma
+
+```json
+{
+ "scope": "contract_deployment",
+ "deployer" | "implement_trait": string
+}
+```
+
+### Parámetros
+
+| Nombre | Tipo | Obligatorio | Descripción |
+|--------|------|-------------|-------------|
+| `deployer` | string | No\* | Dirección STX del implementador |
+| `implement_trait` | cadena | No\* | Rasgo que el contrato debe implementar |
+
+\*Uno de estos parámetros es obligatorio
+
+### Ejemplos
+
+#### Monitorear despliegues por dirección
+
+```json
+{
+ "if_this": {
+ "scope": "contract_deployment",
+ "deployer": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM"
+ }
+}
+```
+
+#### Monitorear implementaciones de traits
+
+```json
+{
+ "if_this": {
+ "scope": "contract_deployment",
+ "implement_trait": "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-09-trait"
+ }
+}
+```
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx
new file mode 100644
index 000000000..624eb25de
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx
@@ -0,0 +1,165 @@
+---
+title: Formateador de claridad
+sidebarTitle: Formateador de claridad
+description: El formateador de Clarity es una herramienta diseñada para formatear automáticamente el código de tu contrato inteligente en Clarity según reglas de estilo estandarizadas. Usar un formato consistente mejora la legibilidad y mantenibilidad del código, facilitando a los desarrolladores entender, colaborar y aprender de proyectos existentes en Clarity.
+---
+## Filosofía de formato
+
+El formateador aplica un estándar predefinido diseñado para hacer que el código de Clarity sea más legible:
+
+* **Longitud de línea** - Las líneas se ajustan a 80 caracteres por defecto
+* **Sangría** - Usa 2 espacios para consistencia
+* **Estructura** - Impone patrones consistentes para funciones, enlaces let y flujo de control
+
+Estos valores predeterminados son configurables para adaptarse a tus preferencias.
+
+### Puntos de integración
+
+El formateador está disponible en dos herramientas de desarrollo principales:
+
+1. **Extensión Clarity para VS Code** - Formatear directamente dentro de tu editor
+2. **Clarinet CLI** - Formatear a través de la línea de comandos, incluyendo proyectos completos
+
+## Tabla de comparación
+
+| Aspecto | Formato Manual | Formateador de Clarity |
+|--------|------------------|-------------------|
+| Consistencia | Varía según el desarrollador | Uniforme en toda la base de código |
+| Velocidad | Consume tiempo | Instantáneo |
+| Propenso a errores | Sí | No |
+| Coordinación del equipo | Requiere guía de estilo | Aplicación automática |
+
+## Mejores prácticas
+
+* **Formatear al guardar** - Habilitar el formato automático en VS Code
+* **Ganchos pre-commit** - Asegúrate de que todo el código esté formateado antes de los commits
+* **Adopción del equipo** - Utiliza configuraciones consistentes en todo tu equipo
+
+## Lecturas adicionales
+
+### Reglas de formato en detalle
+
+El formateador maneja muchas construcciones de Clarity con reglas específicas:
+
+
+
+ Definiciones de funciones
+
+
+ Las funciones siempre abarcan múltiples líneas con sangría consistente:
+
+ ```clarity
+ (define-public (my-func
+ (amount uint)
+ (sender principal)
+ )
+ (ok true)
+ )
+ ```
+
+ Los argumentos individuales pueden permanecer en la primera línea:
+
+ ```clarity
+ (define-read-only (get-balance (who principal))
+ (ok u0)
+ )
+ ```
+
+
+
+
+ Expresiones let
+
+
+ Los enlaces se colocan en líneas separadas con sangría consistente:
+
+ ```clarity
+ (let (
+ (a u1)
+ (b u2)
+ )
+ (body-expression)
+ )
+ ```
+
+
+
+
+ Control de flujo (if, match)
+
+
+ Cada rama obtiene su propia línea:
+
+ ```clarity
+ (if condition
+ (then-expression)
+ (else-expression)
+ )
+
+ (match optional-value
+ value (handle-some value)
+ (handle-none)
+ )
+ ```
+
+
+
+
+ Tuplas y mapas
+
+
+ Convierte automáticamente a sintaxis endulzada con formato adecuado:
+
+ ```clarity
+ ;; Input: (tuple (n1 u1) (n2 u2))
+ ;; Output:
+ {
+ n1: u1,
+ n2: u2,
+ }
+ ```
+
+
+
+
+### Ejemplos de uso
+
+#### Integración con VS Code
+
+```json
+// settings.json
+"[clarity]": {
+ "editor.formatOnSave": true,
+},
+```
+
+#### Uso de la CLI
+
+```terminal
+$ clarinet format --in-place
+```
+
+Formato con configuraciones personalizadas:
+
+```terminal
+$ clarinet format -i 4 -l 120 --in-place
+```
+
+Verificar el formato en los pipelines de CI/CD:
+
+```terminal
+$ clarinet format --check
+```
+
+El `--check` flag valida que todos los archivos de Clarity estén correctamente formateados sin modificarlos. Esto es perfecto para flujos de trabajo de integración continua donde se desea garantizar la consistencia del estilo de código.
+
+### Ignorando bloques de código
+
+Evitar el formato de bloques de código específicos:
+
+```clarity
+;; @format-ignore
+(define-constant something (list
+ 1 2 3 ;; Preserves custom spacing
+ 4 5 ))
+```
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/cli-reference.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/cli-reference.mdx
new file mode 100644
index 000000000..b43689e39
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/cli-reference.mdx
@@ -0,0 +1,414 @@
+---
+title: Referencia de la CLI
+sidebarTitle: Referencia de la CLI
+isNew: true
+---
+El CLI de Clarinet proporciona un conjunto completo de herramientas para el desarrollo de contratos inteligentes en Clarity. Desde la inicialización del proyecto hasta la implementación, Clarinet optimiza todo tu flujo de trabajo de desarrollo.
+
+* Crear un nuevo proyecto: [`clarinet new`](#clarinet-new)
+* Generar un nuevo contrato inteligente: [`clarinet contracts new`](#clarinet-contracts)
+* Validar la sintaxis y los tipos del contrato: [`clarinet check`](#clarinet-check)
+* Interactive REPL for testing contracts: [`clarinet console`](#clarinet-console)
+* Lanza una red de desarrollo local: [`clarinet devnet start`](#clarinet-devnet)
+* Gestionar despliegues: [`clarinet deployments`](#clarinet-deployments)
+
+## Inicializar un nuevo proyecto \[#initialize-a-new-project]
+
+### clarinet new
+
+`clarinet new` crea un nuevo proyecto con todos los archivos de configuración y la estructura de directorios necesarios.
+
+**Uso**
+
+```console
+clarinet new [OPTIONS]
+```
+
+```terminal
+$ clarinet new my-defi-protocol
+[32mCreate directory[0m [1mmy-defi-protocol[0m
+[32mCreate directory[0m [1mcontracts[0m
+[32mCreate directory[0m [1msettings[0m
+[32mCreate directory[0m [1mtests[0m
+[32mCreate file[0m [1mClarinet.toml[0m
+[32mCreate file[0m [1msettings/Mainnet.toml[0m
+[32mCreate file[0m [1msettings/Testnet.toml[0m
+[32mCreate file[0m [1msettings/Devnet.toml[0m
+[32mCreate directory[0m [1m.vscode[0m
+[32mCreate file[0m [1m.vscode/settings.json[0m
+[32mCreate file[0m [1m.vscode/tasks.json[0m
+[32mCreate file[0m [1m.gitignore[0m
+[32mCreate file[0m [1m.gitattributes[0m
+[32mCreate file[0m [1mpackage.json[0m
+[32mCreate file[0m [1mtsconfig.json[0m
+[32mCreate file[0m [1mvitest.config.js[0m
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--disable-telemetry` | No proporcionar telemetría de uso del desarrollador para este proyecto |
+
+## Gestiona tus contratos \[#manage-your-contracts]
+
+### contratos de Clarinet
+
+`clarinet contracts` es un subcomando para trabajar con contratos. Tiene dos subcomandos:
+
+| Comando | Descripción |
+|---------|-------------|
+| `new` | Generar archivos y configuraciones para un nuevo contrato |
+| `rm` | Eliminar archivos y configuraciones de un contrato |
+
+**Uso con `new`**
+
+```console
+clarinet contracts new
+```
+
+```terminal
+$ clarinet contracts new fungible-token
+[32mCreated file[0m [1mcontracts/fungible-token.clar[0m
+[32mCreated file[0m [1mtests/fungible-token.test.ts[0m
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+**Uso con `rm`**
+
+```console
+clarinet contracts rm
+```
+
+```terminal
+$ clarinet contracts rm old-token
+[33mRemoved file[0m [1mcontracts/old-token.clar[0m
+[33mRemoved file[0m [1mtests/old-token.test.ts[0m
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--manifest-path ` | Ruta a Clarinet.toml |
+
+## Valide sus contratos \[#validate-your-contracts]
+
+### clarinet check
+
+`clarinet check` verifica la sintaxis de los contratos y realiza la comprobación de tipos.
+
+**Uso**
+
+```console
+$ clarinet check [FILE] [OPTIONS]
+```
+
+```terminal
+$ clarinet check
+[32m✔[0m [1m3 contracts checked[0m
+$ clarinet check contracts/token.clar
+[32m✔[0m [1mcontracts/token.clar syntax checks passed[0m
+```
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml |
+| `--deployment-plan-path ` | `-p` | Si se especifica, utilizar este archivo de implementación |
+| `--use-on-disk-deployment-plan` | `-d` | Usar plan de implementación en disco (evitar cálculos de actualizaciones) |
+| `--use-computed-deployment-plan` | `-c` | Usar plan de despliegue calculado (sobrescribirá la versión en disco si hay alguna actualización) |
+| `--enable-clarity-wasm` | | Permitir que la vista previa de Clarity Wasm se ejecute en paralelo con el intérprete de Clarity (beta) |
+
+## Interact with your contracts in a local REPL \[#interact-with-your-contracts-in-a-local-repl]
+
+### consola de clarinet
+
+`clarinet console` loads contracts in a REPL for an interactive session.
+
+**Uso**
+
+```console
+$ clarinet console [OPTIONS]
+```
+
+```terminal
+$ clarinet console
+[32mclarity-repl v1.0.0[0m
+Enter ".help" for usage hints.
+Connected to a transient in-memory database.
+```
+
+La consola de Clarinet ofrece una variedad de comandos para la interacción con contratos:
+
+* `::help`: Enumera todos los comandos de consola
+* `::functions`: Mostrar todas las funciones nativas disponibles en Clarity
+* `::keywords`: Mostrar todas las palabras clave nativas disponibles en Clarity
+* `::describe | `: Mostrar documentación para una función nativa o palabra clave determinada
+* `::toggle_costs`: Mostrar análisis de costo después de cada expresión
+* `::toggle_timings`: Mostrar la duración de la ejecución
+* `::mint_stx `: Acuñar saldo de STX para un principal dado
+* `::set_tx_sender `: Establecer la variable tx-sender al principal
+* `::get_assets_maps`: Obtener mapas de activos para cuentas activas
+* `::get_contracts`: Obtener contratos
+* `::get_block_height`: Obtener la altura actual del bloque
+* `::advance_chain_tip `: Simular la minería de `` bloques
+* `::advance_stacks_chain_tip `: Simular la minería de `` bloques de Stacks
+* `::advance_burn_chain_tip `: Simular la minería de `` bloques de burnchain
+* `::set_epoch `: Actualizar la época actual
+* `::get_epoch`: Obtener la época actual
+* `::debug `: Iniciar una sesión de depuración interactiva ejecutando ``
+* `::trace `: Generar un rastro de ejecución para ``
+* `::get_costs `: Mostrar el análisis de costos
+* `::reload`: Recargar el contrato o contratos existentes en la sesión
+* `::read `: Leer expresiones desde un archivo
+* `::encode `: Codificar una expresión a una representación en bytes de Valor Clarity
+* `::decode `: Decodificar una representación en bytes de un valor de Clarity
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml |
+| `--deployment-plan-path ` | `-p` | Si se especifica, utilizar este archivo de implementación |
+| `--use-on-disk-deployment-plan` | `-d` | Usar plan de implementación en disco (evitar cálculos de actualizaciones) |
+| `--use-computed-deployment-plan` | `-c` | Usar plan de despliegue calculado (sobrescribirá la versión en disco si hay alguna actualización) |
+| `--enable-remote-data` | `-r` | Habilitar la obtención de datos remotos desde la red principal o una red de pruebas |
+| `--remote-data-api-url ` | `-a` | Establecer una URL personalizada de la API de Stacks Blockchain para la obtención de datos remotos |
+| `--remote-data-initial-height ` | `-b` | Altura inicial del bloque remoto de Stacks |
+| `--enable-clarity-wasm` | | Permitir que la vista previa de Clarity Wasm se ejecute en paralelo con el intérprete de Clarity (beta) |
+
+## Iniciar una red de desarrollo local \[#start-a-local-development-network]
+
+### clarinet devnet
+
+`clarinet devnet` es un subcomando para trabajar con Devnet. Tiene dos subcomandos:
+
+| Comando | Descripción |
+|----------|-------------------------------------------------------|
+| `start` | Inicie una red Devnet local para interactuar con sus contratos |
+| `package`| Generar paquete de todos los artefactos requeridos para devnet |
+
+**Uso con `start`**
+
+```console
+$ clarinet devnet start [OPTIONS]
+```
+
+```terminal
+$ clarinet devnet start
+```
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml |
+| `--no-dashboard` | | Mostrar flujos de registros en lugar del panel de interfaz de usuario de la terminal |
+| `--deployment-plan-path ` | `-p` | Si se especifica, utilizar este archivo de implementación |
+| `--use-on-disk-deployment-plan` | `-d` | Usar plan de implementación en disco (evitar cálculos de actualizaciones) |
+| `--use-computed-deployment-plan` | `-c` | Usar plan de despliegue calculado (sobrescribirá la versión en disco si hay alguna actualización) |
+| `--package ` | | Ruta al Package.json producido por 'clarinet devnet package' |
+
+**Uso con `package`**
+
+```console
+$ clarinet devnet package [OPTIONS]
+```
+
+```terminal
+$ clarinet devnet package --name my-devnet
+[32mPackaging devnet artifacts...[0m
+[32mCreated file[0m [1mmy-devnet.json[0m
+```
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--name ` | `-n` | Nombre del archivo json de salida |
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml |
+
+## Gestiona tus implementaciones \[#manage-your-deployments]
+
+### despliegues de Clarinet
+
+`clarinet deployments` es un subcomando para gestionar despliegues en Devnet/Testnet/Mainnet.
+
+| Comando | Descripción |
+|------------|-------------|
+| `check` | Verificar el formato de implementaciones |
+| `generate` | Generar nuevo despliegue |
+| `apply` | Aplicar despliegue |
+
+**Uso con `check`**
+
+```console
+$ clarinet deployments check [OPTIONS]
+```
+
+```terminal
+$ clarinet deployments check
+[32m✔[0m Deployment files are valid
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--manifest-path ` | Ruta a Clarinet.toml |
+
+**Uso con `generate`**
+
+```console
+$ clarinet deployments generate [OPTIONS]
+```
+
+```terminal
+$ clarinet deployments generate --testnet
+[32mGenerated deployment plan[0m
+[32mCreated file[0m [1mdeployments/default.testnet-plan.yaml[0m
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--simnet` | Generar un archivo de despliegue para entornos simnet (consola, pruebas) |
+| `--devnet` | Generar un archivo de implementación para devnet, utilizando settings/Devnet.toml |
+| `--testnet` | Generar un archivo de despliegue para testnet, utilizando settings/Testnet.toml |
+| `--mainnet` | Generar un archivo de despliegue para mainnet, utilizando settings/Mainnet.toml |
+| `--manifest-path ` | Ruta a Clarinet.toml |
+| `--no-batch` | Generar un archivo de despliegue sin intentar agrupar transacciones (solo simnet) |
+| `--low-cost` | Calcular y establecer el costo, utilizando baja prioridad (se requiere conexión de red) |
+| `--medium-cost` | Calcular y establecer el costo, utilizando prioridad media (se requiere conexión de red) |
+| `--high-cost` | Calcular y establecer el costo, utilizando alta prioridad (se requiere conexión de red) |
+| `--manual-cost` | Dejar la estimación de costos manual |
+
+**Uso con `apply`**
+
+```console
+$ clarinet deployments apply [OPTIONS]
+```
+
+```terminal
+$ clarinet deployments apply --testnet
+[33mApplying deployment to testnet[0m
+[32m✔[0m Broadcasting transaction for token.clar
+ Transaction ID: 0x3d4f5...
+ Contract: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.token
+[32m✔[0m All contracts deployed successfully
+```
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--devnet` | | Aplicar configuración de implementación predeterminada/default.devnet-plan.toml |
+| `--testnet` | | Aplicar configuración de implementación predeterminada/default.testnet-plan.toml |
+| `--mainnet` | | Aplicar configuración de implementación predeterminada/default.mainnet-plan.toml |
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml |
+| `--deployment-plan-path ` | `-p` | Aplicar el plan de implementación especificado |
+| `--no-dashboard` | | Mostrar flujos de registros en lugar del panel de interfaz de usuario de la terminal |
+| `--use-on-disk-deployment-plan` | `-d` | Usar plan de implementación en disco (evitar cálculos de actualizaciones) |
+| `--use-computed-deployment-plan` | `-c` | Usar plan de despliegue calculado (sobrescribirá la versión en disco si hay alguna actualización) |
+
+## Interactuar con contratos de Mainnet \[#interact-with-mainnet-contracts]
+
+### requisitos de Clarinet
+
+`clarinet requirements` es un subcomando para interactuar con contratos de Mainnet.
+
+| Comando | Descripción |
+|---------|-------------|
+| `add` | Añada un contrato de mainnet como dependencia a su proyecto |
+
+**Uso**
+
+```console
+$ clarinet requirements
+```
+
+```terminal
+$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[32mAdded requirement[0m SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--manifest-path ` | Ruta a Clarinet.toml |
+
+## Integraciones del Editor \[#editor-integrations]
+
+### clarinet lsp
+
+`clarinet lsp` inicia el servicio del Protocolo de Servidor de Lenguaje para Clarity, habilitando la finalización inteligente de código, el resaltado de errores y otras características de IDE en editores compatibles.
+
+**Uso**
+
+```console
+$ clarinet lsp
+```
+
+## Depuración \[#debugging]
+
+### clarinet dap
+
+`clarinet dap` inicia el servicio del Protocolo de Adaptador de Depuración, habilitando funciones de depuración como puntos de interrupción, ejecución paso a paso e inspección de variables en editores compatibles.
+
+**Uso**
+
+```console
+$ clarinet dap
+```
+
+## Formatea tu código \[#format-your-code]
+
+### formato de clarinet
+
+`clarinet format` da formato a los archivos de código Clarity según las convenciones estándar.
+
+**Uso**
+
+```console
+$ clarinet format [OPTIONS]
+```
+
+```terminal
+$ clarinet format --check
+$ clarinet format --dry-run
+$ clarinet format --file contracts/token.clar --in-place
+```
+
+| Opción | Corto | Descripción | Requerido |
+|--------|-------|-------------|----------|
+| `--check` | | Comprobar si el código está formateado sin modificar archivos | No |
+| `--dry-run` | | Solo reproducir el resultado del formato | No |
+| `--in-place` | | Reemplazar el contenido de un archivo con el código formateado | No |
+| `--manifest-path ` | `-m` | Ruta a Clarinet.toml | No |
+| `--file ` | `-f` | Si se especifica, formatear solo este archivo | No |
+| `--max-line-length ` | `-l` | Longitud máxima de línea | No |
+| `--indent ` | `-i` | Tamaño de sangría, p. ej. 2 | No |
+| `--tabs` | `-t` | Usar tabulaciones en lugar de espacios | No |
+
+## Utilidades \[#utilities]
+
+### completaciones de clarinet
+
+`clarinet completions` genera scripts de completado de shell para tu shell.
+
+**Uso**
+
+```console
+$ clarinet completions
+```
+
+```terminal
+$ clarinet completions zsh > ~/.zsh/completions/_clarinet
+$ source ~/.zshrc
+```
+
+**Shells compatibles**
+
+* `bash`
+* `zsh`
+* `fish`
+* `powershell`
+* `elvish`
+
+| Opción | Corto | Descripción |
+|--------|-------|-------------|
+| `--shell ` | `-s` | Especifique para qué shell generar el script de completado |
+
+## Variables de entorno \[#environment-variables]
+
+Clarinet admite variables de entorno para la configuración. Todas las variables de entorno tienen el prefijo `CLARINET_`:
+
+```terminal
+$ export CLARINET_MANIFEST_PATH=/path/to/project
+```
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/contract-interaction.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
new file mode 100644
index 000000000..efd4bc9c3
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/contract-interaction.mdx
@@ -0,0 +1,193 @@
+---
+title: Interacción con contratos
+sidebarTitle: Interacción con contratos
+description: Clarinet proporciona herramientas poderosas para interactuar con tus contratos durante el desarrollo. La consola te ofrece un entorno REPL interactivo donde puedes llamar funciones, verificar el estado y depurar problemas en tiempo real.
+---
+## Iniciando la consola
+
+El `clarinet console` el comando inicia una sesión interactiva con todos sus contratos implementados en una cadena de bloques local simulada:
+
+```terminal
+$ clarinet console
+[32mclarity-repl v3.3.0[0m
+[1mEnter "::help" for usage hints.[0m
+[1mConnected to a transient in-memory database.[0m
+```
+
+Once in the console, you have access to a Clarity REPL with your project's contracts already deployed and ready to interact with. The console supports several powerful options for different development scenarios:
+
+| Opción | Descripción |
+|--------|-------------|
+| `--enable-remote-data` | Conéctese a la red principal/red de pruebas para consultar contratos reales |
+| `--deployment-plan-path ` | Usar plan de despliegue específico |
+| `--manifest-path ` | Usar ubicación alternativa de Clarinet.toml |
+| `--remote-data-api-url ` | Usar punto final de API de Stacks personalizado |
+| `--remote-data-initial-height ` | Establecer la altura del bloque inicial para datos remotos |
+
+## Trabajando con datos remotos
+
+Una de las características más poderosas es la capacidad de interactuar con contratos reales de mainnet o testnet desde tu consola local. Esto te permite probar contra contratos realmente desplegados:
+
+```terminal
+$ clarinet console --enable-remote-data
+```
+
+Ahora puedes interactuar directamente con contratos de la red principal:
+
+```terminal -o
+$ (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token get-decimals)
+[32m(ok u8)[0m
+$ (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token get-name)
+[32m(ok "Arkadiko Token")[0m
+```
+
+Esto es invaluable para:
+
+* Probando integraciones con protocolos existentes
+* Verificando el comportamiento del contrato contra el estado de la red principal
+* Desarrollando contratos que dependen de contratos de mainnet
+
+:::callout
+type: warn
+
+### Requisitos de datos remotos
+
+Antes de usar datos remotos, asegúrese de agregar el contrato remoto a su `Clarinet.toml` archivo con `clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token`.
+:::
+
+### Uso de la clave API de Hiro
+
+Para evitar límites de tasa al usar datos remotos, establezca el `HIRO_API_KEY` variable de entorno. Clarinet incluye automáticamente esta clave en todas las solicitudes de API:
+
+```terminal
+$ export HIRO_API_KEY=your_api_key_here
+$ clarinet console --enable-remote-data
+```
+
+La clave de API se envía como el `x-api-key` encabezado en todas las solicitudes a las APIs de Hiro. Puede obtener una clave API gratuita desde el [Plataforma Hiro](https://platform.hiro.so).
+
+### Trabajando con contratos
+
+El `::get_contracts` command muestra todos los contratos disponibles:
+
+```terminal -o
+$ ::get_contracts
+[1m+---------------------------------------------------------+----------------+
+| Contract identifier | Public functions |
+|---------------------------------------------------------+----------------------|
+| ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter | (count-up) |
+| | (get-count (who principal))|
++---------------------------------------------------------+----------------------+[0m
+$ (contract-call? .counter count-up)
+[32m(ok true)[0m
+$ (contract-call? .counter get-count tx-sender)
+[32mu1[0m
+```
+
+### Trabajando con diferentes principales
+
+La consola proporciona varias carteras de prueba que puede utilizar. Cambie entre ellas para probar escenarios de múltiples usuarios:
+
+```terminal -o
+$ ::get_assets_maps
+[1m+-------------------------------------------+-----------------+
+| Address | uSTX |
+|-------------------------------------------+-----------------|
+| ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0 | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP | 100000000000000 |
+|-------------------------------------------+-----------------|
+| ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ | 100000000000000 |
+|-------------------------------------------+-----------------|
+| STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6 | 100000000000000 |
++-------------------------------------------+-----------------+[0m
+$ ::set_tx_sender ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5
+[1mtx-sender switched to ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5[0m
+```
+
+### Trabajando con alturas de bloques
+
+Prueba la lógica "dependiente del tiempo" avanzando la cadena:
+
+```terminal -o
+$ ::get_block_height
+[1mCurrent block height: 4[0m
+$ ::advance_chain_tip 100
+[32mnew burn height: 3[0m
+[32mnew stacks height: 104[0m
+$ ::get_block_height
+[1mCurrent block height: 104[0m
+```
+
+:::callout
+### Comandos de consola
+
+Para obtener una lista completa de los comandos de consola disponibles y su uso, consulte el [Referencia de la CLI](/tools/clarinet/cli-reference#clarinet-console).
+:::
+
+## Problemas comunes
+
+
+
+ Errores de contrato no encontrado
+
+
+
+ Si ve errores de "uso de contrato no resuelto":
+
+ ```terminal
+ $ (contract-call? .missing-contract get-value)
+ [31merror: use of unresolved contract[0m
+ ```
+
+ **Causas comunes:**
+
+ * Nombre del contrato con error tipográfico
+ * Contrato no desplegado en la sesión
+ * Uso del prefijo de contrato incorrecto (`.` para contratos locales)
+
+ **Solución**: Verificar contratos desplegados con `::get_contracts` y use el nombre correcto.
+
+
+
+
+
+ Problemas de conexión de datos remotos
+
+
+
+ Cuando se usa `--enable-remote-data`, es posible que encuentres límites de velocidad o errores de conexión:
+
+ ```terminal
+ $ (contract-call? 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token get-name)
+ [31merror: API rate limit exceeded[0m
+ ```
+
+ **Soluciones:**
+
+ 1. Establece tu clave API de Hiro: `export HIRO_API_KEY=your_key_here`
+ 2. Utilizar un punto final de API personalizado: `--remote-data-api-url https://your-node.com`
+ 3. Esperar a que se restablezca el límite de tasa (generalmente 1 minuto)
+
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Validación y análisis](/tools/clarinet/validation-and-analysis): Aprende cómo probar y validar tu proyecto de Clarinet.
+* [Despliegue](/tools/clarinet/deployment): Aprende cómo desplegar tu proyecto de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/deployment.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/deployment.mdx
new file mode 100644
index 000000000..568c1d16e
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/deployment.mdx
@@ -0,0 +1,447 @@
+---
+title: Desplegando tus contratos
+sidebarTitle: Despliegue de contratos
+description: Clarinet proporciona herramientas de implementación completas para ayudarte a mover tus contratos desde el desarrollo local a las redes de producción. Ya sea que estés probando en devnet, preparando en testnet o lanzando en mainnet, Clarinet simplifica todo el proceso de implementación.
+---
+## Generando planes de despliegue
+
+Los planes de despliegue son archivos YAML que definen exactamente cómo se desplegarán tus contratos. Especifican el orden, la configuración y los detalles de red para cada contrato, asegurando despliegues reproducibles en todos los entornos. Para crear un plan de despliegue para cualquier red, ejecuta el siguiente comando:
+
+```terminal
+$ clarinet deployments generate --testnet
+[32mAnalyzing contracts...[0m
+[32mCalculating deployment costs...[0m
+[32mGenerating deployment plan[0m
+[32mCreated file[0m [1mdeployments/default.testnet-plan.yaml[0m
+```
+
+Esto crea un plan de despliegue basado en la configuración de su proyecto:
+
+```yaml deployments/default.devnet-plan.yaml
+---
+id: 0
+name: Devnet deployment
+network: devnet
+stacks-node: "http://localhost:20443"
+bitcoin-node: "http://devnet:devnet@localhost:18443"
+plan:
+ batches:
+ - id: 0
+ transactions:
+ - contract-publish:
+ contract-name: counter
+ expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+ cost: 6940
+ path: contracts/counter.clar
+ anchor-block-only: true
+ clarity-version: 2
+ epoch: "2.5"
+```
+
+### Estructura del plan de despliegue
+
+Componentes clave de un plan de despliegue:
+
+| Campo | Descripción |
+|-------|-------------|
+| `id` | Identificador único para el despliegue |
+| `name` | Nombre de implementación legible por humanos |
+| `network` | Red objetivo (devnet/testnet/mainnet) |
+| `stacks-node` | Punto final RPC para el nodo Stacks |
+| `bitcoin-node` | Punto final RPC para el nodo de Bitcoin |
+| `plan.batches` | Matriz de lotes de implementación |
+
+### Especificaciones de despliegue
+
+El comportamiento de implementación se configura en dos lugares:
+
+**Configuración del proyecto** (`Clarinet.toml`):
+
+* Versión de Clarity para contratos
+* Dependencias contractuales
+* Requisitos de época
+
+**Configuración de red** (`settings/.toml`):
+
+* Detalles y saldos de la cuenta
+* Puntos finales de red
+* Cuentas de implementación personalizadas
+
+Ejemplo de configuración de red:
+
+```toml settings/Testnet.toml
+[network]
+name = "testnet"
+deployment_fee_rate = 10
+
+[accounts.deployer]
+mnemonic = ""
+balance = 100_000_000_000_000
+derivation = "m/44'/5757'/0'/0/0"
+```
+
+## Trabajando con requisitos contractuales
+
+Su proyecto puede hacer referencia a contratos que ya existen en la blockchain. Esto es especialmente útil para implementar rasgos estandarizados.
+
+### Añadiendo requisitos
+
+Agregar dependencias de contratos externos:
+
+```terminal
+$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[32mAdded requirement[0m SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+Esto actualiza la configuración de tu proyecto:
+
+```toml Clarinet.toml
+[project]
+name = "my-nft-project"
+requirements = [
+ { contract_id = "SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait" }
+]
+```
+
+Al implementar, Clarinet automáticamente:
+
+* Descarga el contrato a través de la API de Stacks
+* Reasigna el principal a una cuenta local para devnet
+* Garantiza que el requisito esté disponible antes de desplegar tus contratos
+
+## Implementación en diferentes redes
+
+
+
+
+ Devnet
+
+
+
+ Testnet
+
+
+
+ Mainnet
+
+
+
+
+ **Implementación rápida para desarrollo local**
+
+ Devnet despliega automáticamente los contratos cuando se inicia:
+
+ ```terminal
+ $ clarinet devnet start
+ [32mStarting devnet...[0m
+ [32mDeploying contracts...[0m
+ [90mDeploying[0m counter.clar [32m✓[0m ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter
+ [90mDeploying[0m token.clar [32m✓[0m ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.token
+ ```
+
+ Para el despliegue manual a una devnet en ejecución:
+
+ ```terminal
+ $ clarinet deployments apply --devnet
+ ```
+
+ Ver [desarrollo local](/tools/clarinet/local-development) para una configuración detallada de devnet.
+
+
+
+ :::callout
+ ### Requisitos previos
+
+ Antes de implementar en la red de pruebas:
+
+ * Obtén STX de testnet desde el [grifo](https://explorer.hiro.so/sandbox/faucet?chain=testnet)
+ * Configura tu cuenta en `settings/Testnet.toml`
+ * Validar contratos con `clarinet check`
+ :::
+
+ **Generar plan de despliegue con estimación de costos**:
+
+ ```terminal
+ $ clarinet deployments generate --testnet --medium-cost
+ ```
+
+ **Implementar contratos**:
+
+ ```terminal
+ $ clarinet deployments apply --testnet
+ ```
+
+
+
+ :::callout
+ type: warn
+
+ ### Lista de verificación de la red principal
+
+ Antes de implementar en la red principal:
+
+ 1. Completar pruebas exhaustivas en la red de pruebas
+ 2. Audite sus contratos para detectar vulnerabilidades de seguridad
+ 3. Asegúrate de tener suficiente STX para las tarifas de implementación
+ 4. Haga una copia de seguridad de sus claves de implementación de forma segura
+ 5. Considere usar una billetera de hardware para el despliegue
+ :::
+
+ **Generar plan de despliegue de red principal**:
+
+ ```terminal
+ $ clarinet deployments generate --mainnet --high-cost
+ ```
+
+ **Desplegar con confirmación**:
+
+ ```terminal
+ $ clarinet deployments apply --mainnet
+ ```
+
+
+
+## Estimación y optimización de costos
+
+### Niveles de tarifas
+
+Elija el nivel de tarifa adecuado para su implementación:
+
+```terminal
+$ clarinet deployments generate --testnet --manual-cost
+```
+
+Opciones de nivel de tarifa:
+
+* `--low-cost`: Minimizar comisiones, confirmación más lenta
+* `--medium-cost`: Tarifas y velocidad equilibradas
+* `--high-cost`: Inclusión prioritaria
+* `--manual-cost`: Elegir interactivamente
+
+### Analizando los costos de implementación
+
+Obtenga un desglose detallado de costos antes de implementar:
+
+```terminal
+$ clarinet deployments generate --testnet --medium-cost
+```
+
+## Configuraciones avanzadas de implementación
+
+### Despliegues de múltiples lotes
+
+Despliegue sistemas complejos con dependencias utilizando lotes:
+
+```yaml deployments/defi-protocol.yaml
+plan:
+ batches:
+ - id: 0
+ transactions:
+ - contract-publish:
+ contract-name: trait-definitions
+ path: contracts/traits.clar
+ clarity-version: 2
+ - id: 1
+ transactions:
+ - contract-publish:
+ contract-name: token
+ path: contracts/token.clar
+ - contract-publish:
+ contract-name: oracle
+ path: contracts/oracle.clar
+ - id: 2
+ transactions:
+ - contract-publish:
+ contract-name: defi-pool
+ path: contracts/defi-pool.clar
+```
+
+Los lotes garantizan:
+
+* Las dependencias se implementan primero
+* Despliegue paralelo dentro de lotes
+* Ejecución secuencial entre lotes
+
+### Tipos de transacciones
+
+Los planes de implementación admiten varios tipos de transacciones:
+
+| Transaction Type | Descripción |
+|--------------------|--------------------------------------------------------------------------------------------|
+| Contract Operations| Implica publicar y llamar contratos, especificando remitente, costo y ruta |
+| Asset Transfers | Transfiere activos como STX o BTC, especificando remitente, destinatario y cantidades |
+
+**Con operaciones de contrato**:
+
+```yaml
+- contract-publish:
+ contract-name: my-contract
+ expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+ cost: 5960
+ path: contracts/my-contract.clar
+ clarity-version: 2
+
+- contract-call:
+ contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract
+ expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+ method: initialize
+ parameters:
+ - u1000000
+ - "Token Name"
+ cost: 5960
+```
+
+**Con transferencias de activos**:
+
+```yaml
+- stx-transfer:
+ expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+ recipient: ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG
+ mstx-amount: 1000000
+ memo: '0x48656c6c6f' # "Hello" in hex
+
+- btc-transfer:
+ expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d
+ recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg
+ sats-amount: 100000000
+ sats-per-byte: 10
+```
+
+### Personalización manual del plan
+
+Puede editar manualmente los planes de implementación para escenarios complejos:
+
+:::callout
+### Ediciones manuales
+
+Al implementar, Clarinet solicita sobrescribir los cambios manuales. Escriba `no` para mantener tus personalizaciones.
+:::
+
+**Ejemplo de inicialización de contrato**:
+
+```yaml
+- id: 3
+ transactions:
+ - contract-call:
+ contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.token
+ method: initialize
+ parameters:
+ - u1000000 # Initial supply
+ - { name: "My Token", symbol: "MTK", decimals: u6 }
+ expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+```
+
+## Problemas comunes
+
+
+
+ Saldo de STX insuficiente
+
+
+
+ **Error**: "Saldo de STX insuficiente para el despliegue"
+
+ **Soluciones**:
+
+ 1. **Obtener STX de testnet**: Visita el [faucet de testnet](https://explorer.hiro.so/sandbox/faucet?chain=testnet)
+ 2. **Reducir la tasa de comisión**: Usar `--low-cost` opción
+ 3. **Consultar saldo**:
+
+ ```terminal
+ $ clarinet console --testnet
+ >> stx-account 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG
+ ```
+
+
+
+
+
+ El contrato ya existe
+
+
+
+ **Error**: "Contrato 'token' ya desplegado en esta dirección"
+
+ **Causas**:
+
+ * Contrato con el mismo nombre ya desplegado
+ * Intento de implementación anterior exitoso
+
+ **Soluciones**:
+
+ 1. Utilice un nombre de contrato diferente
+ 2. Desplegar desde una dirección diferente
+ 3. Si está realizando pruebas, utilice una cuenta nueva de testnet
+
+
+
+
+
+ Fallos de conexión de red
+
+
+
+ **Error**: "No se pudo conectar al nodo de testnet"
+
+ **Comprobar la configuración de red**:
+
+ ```toml settings/Testnet.toml
+ [network]
+ name = "testnet"
+ node_rpc_address = "https://stacks-node-api.testnet.stacks.co"
+ ```
+
+ **Probar puntos finales alternativos**:
+
+ * Hiro: `https://api.testnet.hiro.so`
+ * Usa tu propio nodo
+
+ **Depurar conexión**:
+
+ ```terminal
+ $ curl -I https://api.testnet.hiro.so/v2/info
+ ```
+
+
+
+
+
+ Plan de despliegue no válido
+
+
+
+ **Errores comunes de YAML**:
+
+ * Sangría incorrecta
+ * Faltan campos obligatorios
+ * Rutas de contrato inválidas
+
+ **Valide su plan**:
+
+ ```terminal
+ $ clarinet deployments check
+ ```
+
+ **Regenerar si es necesario**:
+
+ ```terminal
+ $ clarinet deployments generate --testnet
+ ```
+
+ **Verificar que existan las rutas de los contratos**:
+
+ ```terminal
+ $ ls contracts/
+ ```
+
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Chainhook](/tools/chainhook): Aprende cómo monitorear tus contratos con Chainhook.
+* [Monitoreo de contratos](/tools/contract-monitoring): Aprende cómo monitorear tus contratos con Chainhook.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
new file mode 100644
index 000000000..fdbb47016
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx
@@ -0,0 +1,491 @@
+---
+title: Trabajando con una blockchain local
+sidebarTitle: Desarrollo de blockchain local
+description: Clarinet proporciona un entorno de blockchain local completo, ofreciendo todos los servicios que necesitas para el desarrollo de contratos inteligentes sin necesidad de desplegar en una red pública.
+---
+## Iniciando tu blockchain local
+
+Para iniciar devnet con todos los servicios requeridos, ejecute el siguiente comando:
+
+```terminal
+$ clarinet devnet start
+```
+
+| Opción | Descripción |
+|--------|-------------|
+| `--manifest-path ` | Usar ubicación alternativa de Clarinet.toml |
+| `--no-dashboard` | Mostrar registros en lugar de interfaz de usuario interactiva |
+| `--deployment-plan-path ` | Usar plan de despliegue específico |
+| `--use-on-disk-deployment-plan` | Usar el plan de despliegue existente sin actualizaciones |
+| `--use-computed-deployment-plan` | Calcular y sobrescribir el plan de implementación |
+| `--package ` | Usar configuración preempaquetada de devnet |
+
+:::callout
+### Requisitos previos
+
+Devnet requiere que Docker esté en ejecución. Si ves "clarinet was unable to create network", asegúrate de que Docker Desktop esté funcionando o que el demonio de Docker se haya iniciado.
+:::
+
+Por defecto, devnet inicia con un panel interactivo que muestra:
+
+* Estado del servicio y salud
+* Transacciones recientes
+* Producción de bloques
+* Despliegues de contratos
+* Uso de recursos
+
+Usa el `--no-dashboard` bandera para entornos de CI/CD o cuando prefieres registros en streaming.
+
+## Servicios y características principales
+
+Devnet crea un entorno blockchain completo con estos servicios:
+
+| Servicio | Puerto | Propósito |
+|---------|------|---------|
+| **Nodo de Stacks** | 20443 | Procesa transacciones y mina bloques |
+| **Nodo de Bitcoin** | 18443 | Proporciona anclaje de bloques en modo regtest |
+| **API de Stacks** | 3999 | REST API for querying blockchain data |
+| **Base de datos Postgres** | 5432 | Indexa los datos de la cadena de bloques para consultas rápidas |
+| **Explorador de Stacks** | 8000 | Interfaz web para navegar transacciones |
+| **Explorador de Bitcoin** | 8001 | Interfaz de usuario web para la cadena regtest de Bitcoin |
+
+Devnet incluye cuentas prefinanciadas con saldos de STX:
+
+```terminal -o
+$ clarinet console
+$ ::get_assets_maps
+[1m+-------------------------------------------+-----------------+
+| Address | STX Balance |
+|-------------------------------------------+-----------------|
+| ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM | 100000000000000 |
+| ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 | 100000000000000 |
+| ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG | 100000000000000 |
+| ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC | 100000000000000 |
+| ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND | 100000000000000 |
++-------------------------------------------+-----------------+[0m
+```
+
+Cuando se inicia devnet, automáticamente despliega los contratos de tu proyecto:
+
+```terminal -o
+$ clarinet devnet start
+[32mDeploying contracts...[0m
+[90mDeploying[0m counter.clar [32m✓[0m ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter
+[90mDeploying[0m token.clar [32m✓[0m ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.token
+[90mDeploying[0m marketplace.clar [32m✓[0m ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.marketplace
+
+[32mAll contracts deployed successfully[0m
+```
+
+## Configuración y personalización
+
+El comportamiento de Devnet se controla a través de archivos de configuración en su proyecto.
+
+### Configuración básica
+
+El `settings/Devnet.toml` archivo controla la configuración de red:
+
+```toml settings/Devnet.toml
+[network]
+name = "devnet"
+
+# Service ports
+stacks_node_rpc_port = 20443
+stacks_api_port = 3999
+stacks_explorer_port = 8000
+bitcoin_node_rpc_port = 18443
+
+# Mining configuration
+[network.devnet]
+bitcoin_controller_block_time = 30_000 # 30 seconds
+
+# Disable services you don't need
+disable_bitcoin_explorer = false
+disable_stacks_explorer = false
+disable_stacks_api = false
+```
+
+### Configuración del puerto
+
+Personalice los puertos para evitar conflictos:
+
+```toml
+# Change default ports
+stacks_node_rpc_port = 30443
+stacks_api_port = 4999
+postgres_port = 6432
+stacks_explorer_port = 4020
+```
+
+### Intervalos de minería
+
+Controlar la velocidad de producción de bloques:
+
+```toml
+# Fast blocks for development (1 second)
+bitcoin_controller_block_time = 1_000
+
+# Standard testing (30 seconds)
+bitcoin_controller_block_time = 30_000
+
+# Realistic timing (2 minutes)
+bitcoin_controller_block_time = 120_000
+```
+
+### Cuentas personalizadas
+
+Agregar cuentas con saldos específicos:
+
+```toml Clarinet.toml
+[accounts.treasury]
+mnemonic = "twice kind fence tip hidden tilt action fragile skin nothing glory cousin"
+balance = 10_000_000_000_000 # 10M STX
+
+[accounts.alice]
+mnemonic = "female adjust gallery certain visit token during great side clown fitness like"
+balance = 5_000_000_000_000 # 5M STX
+```
+
+## Accediendo a los servicios
+
+Accede a varios servicios para interactuar con la blockchain, incluyendo la navegación de datos, consulta de APIs y envío de transacciones directamente.
+
+
+
+
+ Explorador de Stacks
+
+
+
+ Puntos finales de la API
+
+
+
+ RPC directo
+
+
+
+
+ Explore transacciones, bloques y el estado de los contratos a través de la interfaz web:
+
+ ```
+ http://localhost:8000
+ ```
+
+ El explorador proporciona:
+
+ * Historial y detalles de transacciones
+ * Información del bloque
+ * Código fuente y estado del contrato
+ * Saldos de cuenta
+
+
+
+ Consulta datos de blockchain utilizando la API de Stacks:
+
+ ```terminal
+ $ curl http://localhost:3999/v2/info
+ {
+ "peer_version": 4207599113,
+ "burn_block_height": 102,
+ "stacks_tip_height": 68,
+ "network_id": 2147483648
+ }
+ ```
+
+ Puntos finales comunes:
+
+ * `/v2/info` - Información de la red
+ * `/v2/accounts/{address}` - Detalles de la cuenta
+ * `/v2/contracts/source/{address}/{name}` - Fuente del contrato
+ * `/extended/v1/tx/{txid}` - Detalles de la transacción
+
+
+
+ Enviar transacciones directamente al nodo de Stacks:
+
+ ```terminal
+ $ curl -X POST http://localhost:20443/v2/transactions \
+ -H "Content-Type: application/json" \
+ -d @transaction.json
+ ```
+
+ Puntos finales RPC:
+
+ * `/v2/transactions` - Transmitir transacciones
+ * `/v2/contracts/call-read` - Llamar funciones de solo lectura
+ * `/v2/fees/transfer` - Obtener estimaciones de tarifas
+
+
+
+## Configuración avanzada
+
+### Optimización del rendimiento
+
+Para ciclos de desarrollo rápidos:
+
+```toml settings/Devnet.toml
+[network.devnet]
+# 1 second blocks
+bitcoin_controller_block_time = 1_000
+
+# Disable explorers for speed
+disable_bitcoin_explorer = true
+disable_stacks_explorer = true
+
+# Keep API for contract interaction
+disable_stacks_api = false
+```
+
+### Configuración de época
+
+Prueba diferentes versiones de Stacks:
+
+```toml
+[epochs]
+epoch_2_0 = 0 # Stacks 2.0 from genesis
+epoch_2_05 = 0 # Stacks 2.05 from genesis
+epoch_2_1 = 0 # Stacks 2.1 from genesis
+epoch_2_2 = 0 # Pox-2 from genesis
+epoch_2_3 = 0 # Pox-3 from genesis
+epoch_2_4 = 0 # Pox-4 from genesis
+epoch_3_0 = 101 # Nakamoto activation at block 101
+```
+
+### Despliegue de paquetes
+
+Crear configuraciones de devnet reutilizables:
+
+```terminal
+$ clarinet devnet package --name demo-env
+[32mPackaging devnet configuration...[0m
+[32mCreated[0m demo-env.json
+```
+
+Usar configuración empaquetada:
+
+```terminal
+$ clarinet devnet start --package demo-env.json
+```
+
+## Problemas comunes
+
+
+
+ Errores de conexión de Docker
+
+
+
+ **Error**: "clarinet no pudo crear la red"
+
+ **Soluciones**:
+
+ 1. Asegúrese de que Docker Desktop esté en ejecución (macOS/Windows)
+ 2. Iniciar el daemon de Docker: `sudo systemctl start docker` (Linux)
+ 3. Verificar los permisos de Docker: `docker ps`
+ 4. Restablecer Docker a los valores predeterminados de fábrica si los problemas persisten
+
+ **Verificar Docker**:
+
+ ```terminal
+ $ docker --version
+ Docker version 24.0.7, build afdd53b
+ $ docker ps
+ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+ ```
+
+
+
+
+
+ Puerto ya en uso
+
+
+
+ **Error**: "bind: dirección ya en uso"
+
+ **Encontrar proceso usando puerto**:
+
+ Para macOS/Linux:
+
+ ```terminal
+ $ lsof -i :3999
+ $ kill -9 $(lsof -t -i:3999)
+ ```
+
+ Para Windows:
+
+ ```terminal
+ $ netstat -ano | findstr :3999
+ $ taskkill /PID
/F
+ ```
+
+ **O configura puertos diferentes** en `settings/Devnet.toml`:
+
+ ```toml
+ stacks_api_port = 4999
+ stacks_explorer_port = 4020
+ postgres_port = 6432
+ ```
+
+
+
+
+
+ Alto uso de recursos
+
+
+
+ **Síntomas**: Rendimiento lento, alto uso de CPU/memoria
+
+ **Optimizar recursos**:
+
+ ```toml
+ # Disable unused services
+ disable_bitcoin_explorer = true
+ disable_stacks_explorer = true
+
+ # Slower block production
+ bitcoin_controller_block_time = 60_000
+ ```
+
+ **Límites de recursos de Docker**:
+
+ ```terminal
+ $ docker update --memory="2g" --cpus="1"
+ ```
+
+ **Limpiar datos antiguos**:
+
+ ```terminal
+ $ clarinet devnet stop
+ $ docker system prune -a
+ $ rm -rf tmp/devnet
+ ```
+
+
+
+
+
+ Error: la red ya existe
+
+
+
+ **Error**: "Docker respondió con el código de estado 409: red con nombre `.devnet` ya existe"
+
+ Esto ocurre cuando una sesión anterior de devnet no se limpió correctamente, dejando una red Docker atrás.
+
+ **Solución - Eliminar la red existente**:
+
+ ```terminal
+ $ docker network rm .devnet
+ ```
+
+ O si no estás seguro del nombre exacto de la red:
+
+ ```terminal
+ $ docker network ls | grep devnet
+ $ docker network rm
+ ```
+
+ **Prevención**:
+
+ * Usar `Ctrl+C` para detener elegantemente devnet
+ * Verificar si hay redes huérfanas después de bloqueos:
+
+ ```terminal
+ $ docker network prune
+ ```
+
+ **Nota**: El nombre de la red se basa en el nombre del directorio de su proyecto, por lo que un `clarinet new hello-world` el proyecto tendrá un nombre de red de `hello-world.devnet`.
+
+
+
+
+
+ Error de flujo de Docker durante el inicio
+
+
+
+ **Error**: "Fatal: no se puede crear la imagen: error de flujo de Docker"
+
+ Este error suele ocurrir cuando las imágenes de Docker están dañadas o cuando los exploradores no logran iniciarse correctamente.
+
+ **Solución 1 - Desactivar exploradores**:
+
+ Si no necesitas los exploradores web, desactívalos en `settings/Devnet.toml`:
+
+ ```toml
+ disable_bitcoin_explorer = true
+ disable_stacks_explorer = true
+ ```
+
+ **Solución 2 - Limpiar el entorno de Docker**:
+
+ Eliminar todos los contenedores e imágenes, luego reiniciar:
+
+ ```terminal
+ $ docker stop $(docker ps -a -q)
+ $ docker system prune -a
+ $ docker volume prune
+ ```
+
+ **Solución 3 - Limpieza completa y reinicio**:
+
+ ```terminal
+ $ docker stop $(docker ps -a -q)
+ $ docker network rm
.devnet
+ $ docker system prune --all --volumes
+ $ clarinet devnet start
+ ```
+
+ Esto garantiza un entorno Docker limpio para que devnet comience de cero.
+
+
+
+
+
+ Fallos en el despliegue de contratos
+
+
+
+ **Verificar el orden de despliegue** en `Clarinet.toml`:
+
+ ```toml
+ # Deploy dependencies first
+ [contracts.sip-010-trait]
+ path = "contracts/sip-010-trait.clar"
+
+ [contracts.token]
+ path = "contracts/token.clar"
+ ```
+
+ **Validar contratos primero**:
+
+ ```terminal
+ $ clarinet check
+ ```
+
+ **Revisar los registros de implementación**:
+
+ ```terminal
+ $ clarinet devnet start --no-dashboard
+ ```
+
+ **Despliegue manual**:
+
+ ```terminal
+ $ clarinet deployments generate --devnet
+ $ clarinet deployments apply --devnet
+ ```
+
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Interacción con contratos](/tools/clarinet/contract-interaction): Aprende cómo interactuar con tus contratos.
+* [Despliegue](/tools/clarinet/deployment): Aprende cómo desplegar tu proyecto de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/project-development.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/project-development.mdx
new file mode 100644
index 000000000..3e7bafad5
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/project-development.mdx
@@ -0,0 +1,174 @@
+---
+title: Administrando tus proyectos
+sidebarTitle: Desarrollo del proyecto
+description: Clarinet agiliza todo el ciclo de vida del desarrollo de contratos inteligentes en Clarity. Desde la inicialización del proyecto hasta la gestión de contratos y el formateo de código, tendrás todas las herramientas necesarias para un desarrollo profesional.
+---
+## Creando un proyecto nuevo
+
+El `clarinet new` el comando crea una estructura de proyecto completa con todos los archivos de configuración necesarios:
+
+```terminal
+$ clarinet new my-defi-app
+[32mCreate directory[0m [1mmy-defi-app[0m
+[32mCreate directory[0m [1mcontracts[0m
+[32mCreate directory[0m [1msettings[0m
+[32mCreate directory[0m [1mtests[0m
+[32mCreate file[0m [1mClarinet.toml[0m
+[32mCreate file[0m [1msettings/Mainnet.toml[0m
+[32mCreate file[0m [1msettings/Testnet.toml[0m
+[32mCreate file[0m [1msettings/Devnet.toml[0m
+[32mCreate directory[0m [1m.vscode[0m
+[32mCreate file[0m [1m.vscode/settings.json[0m
+[32mCreate file[0m [1m.vscode/tasks.json[0m
+[32mCreate file[0m [1m.gitignore[0m
+[32mCreate file[0m [1m.gitattributes[0m
+[32mCreate file[0m [1mpackage.json[0m
+[32mCreate file[0m [1mtsconfig.json[0m
+[32mCreate file[0m [1mvitest.config.js[0m
+```
+
+| Opción | Descripción | Ejemplo |
+|--------|-------------|---------|
+| `--disable-telemetry` | Optar por no participar en la recopilación de telemetría | `clarinet new my-app --disable-telemetry` |
+
+Para una mirada más profunda a la estructura del proyecto generada, consulte el [estructura del proyecto](/tools/clarinet/project-structure) guía.
+
+## Gestionando contratos
+
+### Creando nuevos contratos
+
+El `clarinet contract new` el comando genera tanto un archivo de contrato como su archivo de prueba correspondiente:
+
+```terminal
+$ clarinet contract new token
+[32mCreated file[0m [1mcontracts/token.clar[0m
+[32mCreated file[0m [1mtests/token.test.ts[0m
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+El contrato generado incluye una plantilla mínima:
+
+```clarity contracts/token.clar
+;; token
+;;
+
+;; constants
+;;
+
+;; data vars
+;;
+
+;; data maps
+;;
+
+;; public functions
+;;
+
+;; read only functions
+;;
+
+;; private functions
+;;
+```
+
+### Eliminando contratos
+
+Limpiar contratos no utilizados con el `rm` comando:
+
+```terminal
+$ clarinet contract rm old-token
+[33mRemoved file[0m [1mcontracts/old-token.clar[0m
+[33mRemoved file[0m [1mtests/old-token.test.ts[0m
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+## Verificando la sintaxis de los contratos del proyecto
+
+Valide la configuración completa de su proyecto:
+
+```terminal
+$ clarinet check
+[32m✔[0m [1m3 contracts checked[0m
+```
+
+Verificar contratos específicos:
+
+```terminal
+$ clarinet check contracts/token.clar
+[32m✔[0m [1mcontracts/token.clar Syntax of contract successfully checked[0m
+```
+
+## Formato de código
+
+Clarinet incluye un potente formateador de código para mantener un estilo consistente en todo su proyecto:
+
+Formatear todos los contratos en tu proyecto:
+
+```terminal
+$ clarinet format --in-place
+[32mFormatted[0m [1m5 contracts[0m
+```
+
+### Opciones de formato
+
+Personaliza el formato para que coincida con la guía de estilo de tu equipo:
+
+| Opción | Descripción | Ejemplo |
+|--------|-------------|---------|
+| `--dry-run` | Vista previa de cambios sin modificar archivos | `clarinet format --dry-run` |
+| `--in-place` | Reemplazar contenido del archivo (requerido para el formato real) | `clarinet format --in-place` |
+| `--max-line-length` | Establecer longitud máxima de línea | `clarinet format --max-line-length 100` |
+| `--indent` | Establecer tamaño de sangría | `clarinet format --indent 2` |
+| `--tabs` | Utilice tabulaciones en lugar de espacios | `clarinet format --tabs` |
+
+### Dar formato a archivos individuales
+
+```terminal
+$ clarinet format contracts/messy-contract.clar --in-place
+[32mFormatted[0m [1mcontracts/messy-contract.clar[0m
+```
+
+Formatear contratos específicos utilizando patrones glob:
+
+```terminal
+$ clarinet format contracts/token*.clar --in-place
+[32mFormatted[0m [1mcontracts/token-trait.clar[0m
+[32mFormatted[0m [1mcontracts/token-impl.clar[0m
+```
+
+## Configuración del proyecto
+
+### Trabajando con requisitos
+
+Agregar contratos de mainnet como dependencias:
+
+```terminal
+$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[32mAdded requirement[0m SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait
+[33mUpdated[0m [1mClarinet.toml[0m
+```
+
+Esto actualiza tu configuración:
+
+```toml Clarinet.toml
+[project]
+requirements = [
+ { contract_id = "SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait" }
+]
+```
+
+Ahora puedes implementar rasgos de contratos de la red principal:
+
+```clarity contracts/my-nft.clar
+(impl-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)
+
+(define-non-fungible-token my-nft uint)
+;; ... implement required functions
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Interacción con contratos](/tools/clarinet/contract-interaction): Aprende cómo interactuar con tus contratos.
+* [Pruebas y validación](/tools/clarinet/validation-and-analysis): Aprende cómo probar y validar tu proyecto de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx b/content/docs/es/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
new file mode 100644
index 000000000..16232d6b5
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx
@@ -0,0 +1,242 @@
+---
+title: Validando tus contratos
+sidebarTitle: Validación y análisis
+description: Clarinet proporciona herramientas poderosas para validar, analizar y depurar sus contratos inteligentes. Desde la comprobación estática de tipos hasta el análisis de costos en tiempo real, puede asegurarse de que sus contratos sean correctos y eficientes antes de la implementación.
+---
+La validación de contratos en el desarrollo de Clarity abarca análisis estático, depuración en tiempo de ejecución y optimización de costos. Cada enfoque sirve para diferentes propósitos en la garantía de la corrección y eficiencia del contrato.
+
+## Comprendiendo la validación de contratos
+
+**Análisis Estático vs Depuración en Tiempo de Ejecución**
+
+| Static Analysis | Runtime Debugging |
+|-----------------------------|------------------------------|
+| Detecta errores antes del despliegue | Revela el comportamiento durante la ejecución |
+| Incompatibilidades de tipos, errores de sintaxis | Costos reales de ejecución |
+| Violaciones de cumplimiento de rasgos | Cambios de estado y efectos secundarios |
+| Uso de variables no definidas | Flujo y resultados de transacciones |
+| Problemas con firmas de funciones | Cuellos de botella de rendimiento |
+
+## Análisis estático
+
+El `clarinet check` el comando realiza una validación exhaustiva de sus contratos sin ejecutarlos:
+
+```terminal
+$ clarinet check
+[32m✔[0m [1m3 contracts checked[0m
+```
+
+Cuando la validación falla, Clarinet proporciona diagnósticos detallados:
+
+```terminal
+$ clarinet check
+[31m✖[0m [1m1 error detected[0m
+[31mError in contracts/token.clar:15:10[0m
+ |
+15| (ok (+ balance amount))
+ | ^^^^^^^
+ |
+ = [1mType error: expected uint, found (response uint uint)[0m
+```
+
+**Alcance de validación**
+
+Clarinet valida múltiples aspectos de tus contratos:
+
+| Tipo de validación | Qué verifica |
+|----------------|----------------|
+| **Seguridad de tipos** | Parámetros de función, valores de retorno, tipos de variables |
+| **Cumplimiento de rasgos** | La implementación coincide con las definiciones de rasgos |
+| **Consistencia de respuesta** | Las ramas ok/err devuelven los mismos tipos |
+| **Ámbito de variables** | Todas las variables definidas antes de su uso |
+| **Visibilidad de funciones** | Modificadores públicos/privados/de solo lectura |
+
+**Verificando contratos específicos**
+
+Validar contratos individuales durante el desarrollo enfocado:
+
+```terminal
+$ clarinet check contracts/nft.clar
+[32m✔[0m [1mcontracts/nft.clar Syntax of contract successfully checked[0m
+```
+
+**Integración con CI**
+
+Automatice la validación en su pipeline de integración continua. Por ejemplo, utilice GitHub Actions:
+
+```yaml .github/workflows/validate.yml -c
+name: Contract Validation
+on: [push, pull_request]
+
+jobs:
+ sanity-checks:
+ runs-on: ubuntu-latest
+ container: hirosystems/clarinet:latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Check Clarity contracts check
+ run: clarinet check --use-on-disk-deployment-plan
+ - name: Check Clarity contracts format
+ run: clarinet format --check
+```
+
+## Análisis de tiempo de ejecución
+
+La consola de Clarinet proporciona potentes herramientas de análisis en tiempo de ejecución que le permiten inspeccionar el comportamiento del contrato durante la ejecución.
+
+### **Análisis de costos con `::toggle_costs`**
+
+Habilitar la visualización automática del costo después de cada expresión:
+
+```terminal
+$ clarinet console
+$ ::toggle_costs
+[1mAlways show costs: true[0m
+$ (contract-call? .counter count-up)
+[1m+----------------------+----------+------------+------------+
+| | Consumed | Limit | Percentage |
+|----------------------+----------+------------+------------|
+| Runtime | 4775 | 5000000000 | 0.00 % |
+|----------------------+----------+------------+------------|
+| Read count | 5 | 15000 | 0.03 % |
+|----------------------+----------+------------+------------|
+| Read length (bytes) | 268 | 100000000 | 0.00 % |
+|----------------------+----------+------------+------------|
+| Write count | 1 | 15000 | 0.01 % |
+|----------------------+----------+------------+------------|
+| Write length (bytes) | 41 | 15000000 | 0.00 % |
++----------------------+----------+------------+------------+[0m
+[1m(ok true)[0m
+```
+
+### **Trazado de ejecución con `::trace`**
+
+Rastree las llamadas de función para comprender el flujo de ejecución:
+
+```terminal
+$ ::trace (contract-call? .defi-pool swap u100 'token-a 'token-b)
+(contract-call? .defi-pool swap u100 'token-a 'token-b) [1m[0m
+( get-pool-balance 'token-a ) [1mdefi-pool:15:8[0m
+ [31m↳ args:[0m [1m'token-a[0m
+ [1mu50000[0m
+( get-pool-balance 'token-b ) [1mdefi-pool:16:8[0m
+ [31m↳ args:[0m [1m'token-b[0m
+ [1mu75000[0m
+( calculate-output u100 u50000 u75000 ) [1mdefi-pool:18:12[0m
+ [31m↳ args:[0m [1mu100, u50000, u75000[0m
+ [1mu149[0m
+[1m(ok u149)[0m
+```
+
+### **Depuración interactiva con `::debug`**
+
+Establece puntos de interrupción y avanza paso a paso por la ejecución:
+
+```terminal
+$ ::debug (contract-call? .complex-contract process-batch)
+$ break validate-input
+[32mBreakpoint set at validate-input[0m
+$ continue
+[33mHit breakpoint at validate-input:23[0m
+```
+
+Comandos de navegación de depuración:
+
+* `step` o `s` - Entrar en sub-expresiones
+* `finish` o `f` - Completar la expresión actual
+* `next` o `n` - Pasar por encima de sub-expresiones
+* `continue` o `c` - Continuar hasta el siguiente punto de interrupción
+
+### **Usando `::get_costs` para analizar los costos de funciones específicas**
+
+```terminal
+$ ::get_costs (contract-call? .defi-pool add-liquidity u1000 u1000)
+[1m+----------------------+----------+------------+------------+
+| | Consumed | Limit | Percentage |
+|----------------------+----------+------------+------------|
+| Runtime | 12250 | 5000000000 | 0.00 % |
+|----------------------+----------+------------+------------|
+| Read count | 6 | 15000 | 0.04 % |
+|----------------------+----------+------------+------------|
+| Read length (bytes) | 192 | 100000000 | 0.00 % |
+|----------------------+----------+------------+------------|
+| Write count | 3 | 15000 | 0.02 % |
+|----------------------+----------+------------+------------|
+| Write length (bytes) | 96 | 15000000 | 0.00 % |
++----------------------+----------+------------+------------+[0m
+[1m(ok {lp-tokens: u1000})[0m
+```
+
+### **Identificando y optimizando operaciones costosas utilizando `::trace`**
+
+```terminal
+$ ::trace (contract-call? .complex-algo process-large-dataset)
+```
+
+Buscar:
+
+* Bucles con altos conteos de iteración
+* Operaciones anidadas de mapeo/filtrado
+* Llamadas repetidas a contratos
+* Manipulaciones de estructuras de datos grandes
+
+## Flujos de trabajo de depuración
+
+Domina la depuración interactiva para identificar problemas rápidamente iniciando una sesión de depuración:
+
+```terminal
+$ clarinet console
+$ ::debug (contract-call? .counter count-up)
+[1mST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter[0m[1m:9:3[0m
+ 6
+ 7 ;; Increment the count for the caller
+ 8 (define-public (count-up)
+-> 9 (ok (map-set counters tx-sender (+ (get-count tx-sender) u1)))
+ ^
+ 10 )
+ 11
+ 12 ;; Get the current count for a user
+(debug)
+$ continue
+```
+
+### **Analizando transacciones fallidas usando `::trace`**
+
+```terminal
+$ ::trace (contract-call? .marketplace purchase u999)
+(contract-call? .marketplace purchase u999) [1m[0m
+( get-listing u999 ) [1mmarketplace:45:12[0m
+ [31m↳ args:[0m [1mu999[0m
+ [1mnone[0m
+[31m(err u404)[0m [1m# Listing not found[0m
+```
+
+### **Usando `::encode` y `::decode` para inspección de datos**
+
+Depurar estructuras de datos complejas:
+
+```terminal
+$ ::encode { id: u1, active: true }
+[32m0c0000000206616374697665030269640100000000000000000000000000000001[0m
+$ ::decode 0d0000000b48656c6c6f20776f726c64
+[32m"Hello world"[0m
+```
+
+### **Probando la lógica dependiente del tiempo**
+
+```terminal
+$ ::get_block_height
+[1mCurrent block height: 4[0m
+$ ::advance_chain_tip 100
+[32mnew burn height: 3[0m
+[32mnew stacks height: 104[0m
+$ (contract-call? .vesting claim)
+[32m(ok {claimed: u2500, remaining: u7500})[0m
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Despliegue](/tools/clarinet/deployment): Aprende cómo desplegar tu proyecto de Clarinet.
+* [SDK de Clarinet](/tools/clarinet/sdk-introduction): Aprende cómo usar el SDK de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx
new file mode 100644
index 000000000..d162cd38b
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx
@@ -0,0 +1,118 @@
+---
+title: Referencia del SDK de navegador JS de Clarinet
+sidebarTitle: Referencia del SDK del navegador
+description: Utilice el SDK de Clarinet directamente en entornos de navegador
+isNew: true
+---
+El SDK de Clarinet se puede utilizar para interactuar con la simnet directamente desde navegadores web, permitiendo pruebas y simulaciones de contratos inteligentes de Clarity sin un backend o entorno de Node.js.
+
+## Instalación
+
+```package-install
+@hirosystems/clarinet-sdk-browser
+```
+
+## Uso
+
+El SDK del navegador implementa la misma API que el Node.js [SDK de Clarinet](/tools/clarinet/sdk-reference). Todos los métodos, propiedades y comparadores personalizados funcionan de manera idéntica.
+
+### Sesión vacía
+
+Para pruebas rápidas y experimentación sin un proyecto de Clarinet:
+
+```ts
+import { initSimnet } from '@hirosystems/clarinet-sdk-browser';
+
+const simnet = await initSimnet();
+await simnet.initEmptySession();
+
+// Execute Clarity code directly
+const result = simnet.runSnippet("(+ 1 2)");
+console.log(result); // 3
+```
+
+### Con un proyecto de Clarinet
+
+Para probar con un proyecto Clarinet existente utilizando un sistema de archivos virtual:
+
+```ts
+import { initSimnet } from '@hirosystems/clarinet-sdk-browser';
+
+const simnet = await initSimnet();
+await simnet.initSession("/project", "Clarinet.toml");
+
+// Your contracts are now available
+const count = simnet.getDataVar('counter', 'count');
+```
+
+:::callout
+### Sistema de archivos virtual
+
+El uso de un proyecto Clarinet en el navegador requiere configurar un sistema de archivos virtual. La documentación y ejemplos para este caso de uso avanzado estarán disponibles próximamente.
+:::
+
+## Casos de uso comunes
+
+### Área de juego interactiva de contratos
+
+```ts
+import { initSimnet } from '@hirosystems/clarinet-sdk-browser';
+import { Cl } from '@stacks/transactions';
+
+// Initialize simnet
+const simnet = await initSimnet();
+await simnet.initEmptySession();
+
+// Deploy a simple contract
+const sourceCode = `
+(define-data-var counter uint u0)
+
+(define-public (increment)
+ (ok (var-set counter (+ (var-get counter) u1))))
+
+(define-read-only (get-counter)
+ (ok (var-get counter)))
+`;
+
+simnet.deployContract('counter', sourceCode, null, simnet.deployer);
+
+// Interact with the contract
+simnet.callPublicFn('counter', 'increment', [], simnet.deployer);
+const count = simnet.callReadOnlyFn('counter', 'get-counter', [], simnet.deployer);
+console.log(count.result); // (ok u1)
+```
+
+### Pruebas en IDEs basados en navegador
+
+```ts
+import { initSimnet } from '@hirosystems/clarinet-sdk-browser';
+import { expect } from 'vitest';
+
+const simnet = await initSimnet();
+await simnet.initEmptySession();
+
+// Run tests directly in the browser
+test('counter increments correctly', () => {
+ simnet.deployContract('counter', counterCode, null, simnet.deployer);
+
+ const result = simnet.callPublicFn('counter', 'increment', [], simnet.deployer);
+ expect(result.result).toBeOk(Cl.uint(1));
+
+ const count = simnet.getDataVar('counter', 'counter');
+ expect(count).toBeUint(1);
+});
+```
+
+## Compatibilidad del navegador
+
+El SDK del navegador funciona en todos los navegadores modernos que admiten:
+
+* ES2020+ JavaScript features
+* WebAssembly
+* Importaciones dinámicas
+
+Los navegadores probados incluyen:
+
+* Chrome/Edge 90+
+* Firefox 89+
+* Safari 15+
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
new file mode 100644
index 000000000..70cfe6dba
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx
@@ -0,0 +1,218 @@
+---
+title: Escribiendo pruebas de integración
+sidebarTitle: Pruebas de integración
+description: Las pruebas de integración son un paso crucial en el desarrollo de contratos inteligentes que implica probar cómo funcionan juntos los diferentes componentes de su sistema. El SDK de Clarinet JS proporciona herramientas poderosas para escribir y ejecutar pruebas de integración, permitiéndole simular escenarios complejos e interacciones entre múltiples contratos.
+---
+import { ArrowRight, Check } from 'lucide-react';
+
+## Lo que aprenderás
+
+:::objectives
+* Configurar pruebas de integración para flujos de trabajo de múltiples pasos
+* Probando interacciones y dependencias de contratos
+* Simular escenarios del mundo real
+* Verificar cambios de estado en todo el sistema
+:::
+
+## Configura tu proyecto
+
+Crea un nuevo proyecto de Clarinet e instala las dependencias:
+
+```terminal
+$ clarinet new stx-defi
+$ cd stx-defi
+$ npm install
+```
+
+## Crear el contrato mejorado
+
+Utilizaremos un contrato DeFi mejorado que admite tanto depósitos como préstamos. Cree el contrato:
+
+```terminal
+$ clarinet contract new defi
+```
+
+Reemplazar `contracts/defi.clar` con esta versión mejorada:
+
+```clarity contracts/defi.clar
+;; Error constants
+(define-constant err-overborrow (err u300))
+
+;; Interest rate (10%)
+(define-data-var loan-interest-rate uint u10)
+
+;; Total deposits in the contract
+(define-data-var total-deposits uint u0)
+
+;; User deposits
+(define-map deposits { owner: principal } { amount: uint })
+
+;; User loans
+(define-map loans principal { amount: uint, last-interaction-block: uint })
+
+;; Deposit STX into the contract
+(define-public (deposit (amount uint))
+ (let
+ (
+ (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
+ )
+ (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
+ (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })
+ (var-set total-deposits (+ (var-get total-deposits) amount))
+ (ok true)
+ )
+)
+
+;; Borrow STX based on deposits (up to 50% of deposit)
+(define-public (borrow (amount uint))
+ (let
+ (
+ (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
+ (allowed-borrow (/ user-deposit u2))
+ (current-loan-details (default-to { amount: u0, last-interaction-block: u0 }
+ (map-get? loans tx-sender)))
+ (accrued-interest (calculate-accrued-interest
+ (get amount current-loan-details)
+ (get last-interaction-block current-loan-details)))
+ (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))
+ (new-loan (+ amount))
+ )
+ (asserts! (<= new-loan allowed-borrow) err-overborrow)
+ (try! (as-contract (stx-transfer? amount tx-sender tx-sender)))
+ (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })
+ (ok true)
+ )
+)
+
+;; Get user's balance
+(define-read-only (get-balance-by-sender)
+ (ok (map-get? deposits { owner: tx-sender }))
+)
+
+;; Get amount owed including interest
+(define-read-only (get-amount-owed)
+ (let
+ (
+ (current-loan-details (default-to { amount: u0, last-interaction-block: u0 }
+ (map-get? loans tx-sender)))
+ (accrued-interest (calculate-accrued-interest
+ (get amount current-loan-details)
+ (get last-interaction-block current-loan-details)))
+ (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))
+ )
+ (ok total-due)
+ )
+)
+
+;; Calculate interest
+(define-private (calculate-accrued-interest (principal uint) (start-block uint))
+ (let
+ (
+ (elapsed-blocks (- block-height start-block))
+ (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))
+ )
+ (asserts! (not (is-eq start-block u0)) (ok u0))
+ (ok interest)
+ )
+)
+```
+
+Correr `clarinet check` para asegurar que su contrato sea válido:
+
+```terminal
+$ clarinet check
+[32m✔ 1 contract checked[0m
+```
+
+## Escribir pruebas de integración
+
+Crea una prueba que simule un flujo de trabajo completo del usuario - depositar y luego pedir prestado:
+
+```typescript tests/defi.test.ts
+import { describe, it, expect } from 'vitest';
+import { Cl } from '@stacks/transactions';
+
+const accounts = simnet.getAccounts();
+const wallet1 = accounts.get('wallet_1')!;
+
+describe('stx-defi integration', () => {
+ it('allows deposit and borrow workflow', () => {
+ // Step 1: User deposits STX
+ const depositResult = simnet.callPublicFn(
+ 'defi',
+ 'deposit',
+ [Cl.uint(1000)],
+ wallet1
+ );
+ expect(depositResult.result).toBeOk(Cl.bool(true));
+
+ // Verify deposit was recorded
+ const totalDeposits = simnet.getDataVar('defi', 'total-deposits');
+ expect(totalDeposits).toBeUint(1000);
+
+ // Step 2: User borrows against deposit
+ const borrowResult = simnet.callPublicFn(
+ 'defi',
+ 'borrow',
+ [Cl.uint(400)], // Borrowing 40% of deposit
+ wallet1
+ );
+ expect(borrowResult.result).toBeOk(Cl.bool(true));
+
+ // Step 3: Check amount owed
+ const { result } = simnet.callReadOnlyFn(
+ 'defi',
+ 'get-amount-owed',
+ [],
+ wallet1
+ );
+ expect(result).toBeOk(Cl.uint(400)); // No interest yet at same block
+ });
+
+ it('prevents over-borrowing', () => {
+ // Setup: deposit first
+ simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);
+
+ // Attempt to borrow more than allowed (>50%)
+ const borrowResult = simnet.callPublicFn(
+ 'defi',
+ 'borrow',
+ [Cl.uint(600)],
+ wallet1
+ );
+
+ // Should fail with err-overborrow
+ expect(borrowResult.result).toBeErr(Cl.uint(300));
+ });
+});
+```
+
+En esta prueba de integración, estamos simulando un escenario donde un usuario deposita STX en el contrato DeFi y luego pide un préstamo contra ese depósito. Analicemos los aspectos clave:
+
+* **`callPublicFn`** - Simula la llamada a funciones públicas tal como en la cadena de bloques real
+* **`getDataVar`** - Recupera el valor de las variables de datos del contrato
+* **`callReadOnlyFn`** - Llama a funciones de solo lectura sin modificar el estado
+* **Comparadores personalizados** - `toBeOk()` y `toBeErr()` validar tipos de respuesta de Clarity
+
+## Pruébalo
+
+Ejecute sus pruebas de integración:
+
+```terminal
+$ npm run test
+```
+
+## Problemas comunes
+
+| Problema | Solución |
+|-------|----------|
+| Contaminación del estado entre pruebas | Cada prueba se ejecuta de forma aislada - el estado no se transfiere |
+| Problemas de sincronización | Usar `simnet.mineEmptyBlocks()` para avanzar la altura del bloque |
+| Afirmaciones complejas | Desglosar en pruebas más pequeñas y enfocadas |
+
+## Próximos pasos
+
+:::next-steps
+* [Referencia del SDK](/tools/clarinet/sdk-reference): Aprende más sobre el SDK de Clarinet JS.
+* [Integración de Stacks.js](/tools/clarinet/stacks-js-integration): Aprende cómo integrar Stacks.js con tu proyecto de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
new file mode 100644
index 000000000..273a16d0b
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx
@@ -0,0 +1,132 @@
+---
+title: Pruebas con datos de la red principal
+sidebarTitle: Simulación de ejecución de la red principal
+description: Mainnet Execution Simulation (MXS) te permite probar tus contratos inteligentes de Clarity utilizando datos y estados reales de la red principal de Stacks. Esta poderosa función ayuda a garantizar que tus contratos se comporten como se espera en un entorno en vivo.
+---
+:::objectives
+* Configurando MXS en tu proyecto de Clarinet
+* Escribiendo pruebas que interactúan con contratos de la red principal
+* Simulando transacciones históricas
+* Entendiendo las limitaciones de MXS
+:::
+
+## ¿Qué es la simulación de ejecución de Mainnet?
+
+Probar contratos inteligentes en condiciones realistas es esencial. Simnet ofrece un entorno aislado pero carece de la complejidad y el historial de la red principal de Stacks en vivo.
+
+MXS llena este vacío al permitir pruebas unitarias con el SDK de Clarinet JS y Vitest para simular el estado de la red principal de Stacks en una altura de bloque específica. Esto te permite:
+
+* **Validar la lógica del contrato con datos reales:** Prueba directamente contratos o datos de la red principal dentro de tus pruebas.
+* **(Re)simular transacciones:** Analiza los resultados, la ejecución o los costos de las transacciones de la red principal sin implementar ni usar STX reales.
+
+## Habilitar MXS en su proyecto
+
+Agregue la siguiente configuración a su `Clarinet.toml` archivo:
+
+```toml Clarinet.toml
+[repl.remote_data]
+# Enable mainnet execution simulation
+enabled = true
+# Specify the Stacks block height to fork from
+initial_height = 522000
+# API URL (optional, defaults to https://api.hiro.so)
+api_url = 'https://api.hiro.so'
+```
+
+:::callout
+type: tip
+
+### Consejo profesional
+
+Estableciendo un específico `initial_height` garantiza resultados de pruebas consistentes y reproducibles.
+:::
+
+## Uso de direcciones de mainnet
+
+Cuando se prueban contratos que verifican o requieren direcciones de la red principal, establezca `use_mainnet_wallets = true`. Esto permite que tus pruebas de simnet utilicen direcciones de mainnet (SP/SM) en lugar de direcciones de testnet (ST).
+
+```toml Clarinet.toml
+[repl.remote_data]
+enabled = true
+initial_height = 522000
+use_mainnet_wallets = true # !mark
+```
+
+Esto es particularmente útil cuando:
+
+* Pruebas contra contratos exclusivos de mainnet como protocolos DEX
+* Su contrato incluye [`(is-standard standard-or-contract-principal)`](/resources/clarity/reference/functions#is-standard) validación
+* Simulando transacciones que requieren formatos de dirección de mainnet
+
+## Configurar el acceso a la API
+
+Aunque MXS funciona sin una clave de API, es posible que encuentre límites de velocidad. Configure una clave de API para un acceso confiable:
+
+```terminal
+$ export HIRO_API_KEY=""
+```
+
+## Escribir pruebas con datos de la red principal
+
+Una vez que MXS está habilitado, tus pruebas operan automáticamente contra la instantánea del estado de la red principal. Aquí tienes un ejemplo de prueba contra la red principal `pox-4` contrato:
+
+```ts tests/pox-4.test.ts
+import { describe, it, expect } from "vitest";
+import { Cl } from "@stacks/transactions";
+
+const accounts = simnet.getAccounts();
+const deployer = accounts.get("deployer")!;
+
+describe("pox-4 mainnet interaction", () => {
+ it("reads current reward cycle from mainnet", () => {
+ // Call the mainnet pox-4 contract
+ const call = simnet.callReadOnlyFn(
+ "SP000000000000000000002Q6VF78.pox-4", // Mainnet contract
+ "current-pox-reward-cycle",
+ [],
+ deployer
+ );
+
+ // Assert the result (adjust based on your initial_height)
+ expect(call.result).toBeUint(109);
+
+ console.log("Current POX reward cycle:", Cl.prettyPrint(call.result));
+ });
+});
+```
+
+La prueba utiliza `simnet.callReadOnlyFn` al igual que en las pruebas unitarias estándar, pero debido a que MXS está habilitado, se dirige al real `pox-4` estado del contrato en la altura de bloque especificada.
+
+## Pruébalo
+
+Ejecuta tu prueba para ver MXS en acción:
+
+```terminal
+$ npm run test
+```
+
+## Problemas comunes
+
+| Problema | Solución |
+|----------|----------|
+| Errores de límite de tasa | Configurar `HIRO_API_KEY` variable de entorno |
+| Resultados inconsistentes | Corregir `initial_height` en configuración |
+| Función no encontrada | Verifique que el contrato exista en su altura de bloque |
+
+## Probando en el área de pruebas
+
+Experimente rápidamente con MXS sin configurar un proyecto:
+
+1. Visitar [https://play.hiro.so/?remote\_data=true](https://play.hiro.so/?remote_data=true)
+2. Ejecutar llamadas de contrato en la red principal:
+
+```terminal
+$ contract-call? 'SP000000000000000000002Q6VF78.pox-4 current-pox-reward-cycle
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Integración del oráculo Pyth](/tools/clarinet/pyth-oracle-integration): Aprende cómo integrar el oráculo Pyth con tu proyecto Clarinet.
+* [Integración de sBTC](/tools/clarinet/sbtc-integration): Aprende cómo integrar el sBTC con tu proyecto Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
new file mode 100644
index 000000000..a3f542a8d
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx
@@ -0,0 +1,301 @@
+---
+title: SDK de JavaScript para Clarinet
+sidebarTitle: Introducción
+description: Guía práctica para probar contratos inteligentes con el SDK JS de Clarinet
+type: concept
+---
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+El SDK de Clarinet JS proporciona un potente marco de pruebas para contratos inteligentes de Clarity. Se integra perfectamente con Vitest para permitir pruebas exhaustivas de la lógica de tu contrato en un entorno simulado.
+
+## Configuración inicial
+
+Comience creando un nuevo proyecto de Node.js o utilizando uno existente:
+
+```package-install
+$ init -y
+```
+
+Instale el SDK de Clarinet JS y las dependencias requeridas:
+
+```package-install
+@hirosystems/clarinet-sdk vitest @stacks/transactions
+```
+
+## Estructura del proyecto
+
+Crea la siguiente estructura para tus pruebas de contratos inteligentes:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Prueba simple
+
+Crea un archivo de prueba simple para verificar que tu contrato funciona:
+
+```ts tests/counter.test.ts
+import { describe, expect, it } from "vitest";
+import { Cl } from "@stacks/transactions";
+
+const accounts = simnet.getAccounts();
+const wallet = accounts.get("wallet_1")!;
+
+describe("counter contract", () => {
+ it("increments the count", () => {
+ const countUpCall = simnet.callPublicFn("counter", "count-up", [], wallet);
+ expect(countUpCall.result).toBeOk(Cl.bool(true));
+ });
+});
+```
+
+El `simnet` El objeto está disponible automáticamente en tus pruebas y proporciona un entorno simulado de la cadena de bloques de Stacks.
+
+## Opciones de configuración
+
+### Configuración de Clarinet
+
+Crear un `Clarinet.toml` archivo para definir tus contratos:
+
+```toml Clarinet.toml
+[project]
+name = "my-project"
+
+[contracts.counter]
+path = "contracts/counter.clar"
+```
+
+### Configuración de TypeScript
+
+Configurar TypeScript para el SDK:
+
+```json tsconfig.json
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "node",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "types": ["vitest/globals"]
+ },
+ "include": ["tests/**/*.ts"],
+ "exclude": ["node_modules"]
+}
+```
+
+### Configuración de Vitest
+
+Configura Vitest para que funcione con el SDK:
+
+```js vitest.config.js
+import { defineConfig } from "vitest/config";
+import { vitestSetupFilePath } from "@hirosystems/clarinet-sdk/vitest";
+
+export default defineConfig({
+ test: {
+ environment: "node",
+ globals: true,
+ setupFiles: [vitestSetupFilePath],
+ },
+});
+```
+
+:::callout
+type: warn
+
+### Importante
+
+El `vitestSetupFilePath` debe ser incluido en su `setupFiles` matriz para que el SDK funcione correctamente.
+:::
+
+### Scripts de paquete
+
+Añade scripts de prueba a tu `package.json`:
+
+```json package.json
+"scripts": {
+ "test": "vitest run",
+ "test:watch": "vitest",
+ "test:coverage": "vitest run --coverage"
+}
+```
+
+## Patrones comunes
+
+### Probando funciones de solo lectura
+
+Cuando se prueban funciones que no modifican el estado, use `callReadOnlyFn`:
+
+```ts
+const getCountCall = simnet.callReadOnlyFn(
+ "counter",
+ "get-count",
+ [Cl.principal(wallet)],
+ wallet
+);
+expect(getCountCall.result).toBeUint(1);
+```
+
+### Probando funciones públicas con parámetros
+
+Pasa parámetros utilizando los ayudantes de tipo Clarity apropiados:
+
+```ts
+const depositCall = simnet.callPublicFn(
+ "defi",
+ "deposit",
+ [Cl.uint(1000)], // Convert JS number to Clarity uint
+ wallet
+);
+expect(depositCall.result).toBeOk(Cl.bool(true));
+```
+
+### Accediendo al estado del contrato
+
+Verificar variables de datos y mapas directamente:
+
+```ts
+// Get a data variable
+const totalDeposits = simnet.getDataVar("defi", "total-deposits");
+expect(totalDeposits).toBeUint(1000);
+
+// Get a map entry
+const balance = simnet.getMapEntry("defi", "balances", Cl.principal(wallet));
+expect(balance).toBeUint(1000);
+```
+
+## Ejemplos
+
+### Probando el despliegue de contratos
+
+Asegúrese de que su contrato esté correctamente desplegado antes de probar sus funciones:
+
+```ts
+it("ensures the contract is deployed", () => {
+ const contractSource = simnet.getContractSource("counter");
+ expect(contractSource).toBeDefined();
+});
+```
+
+### Probando condiciones de error
+
+Verifique que su contrato maneje los errores correctamente:
+
+```ts
+it("fails when borrowing too much", () => {
+ const borrowCall = simnet.callPublicFn(
+ "defi",
+ "borrow",
+ [Cl.uint(10000)], // Amount exceeds allowed
+ wallet
+ );
+ expect(borrowCall.result).toBeErr(Cl.uint(300)); // err-overborrow
+});
+```
+
+### Pruebas con múltiples cuentas
+
+Simular interacciones entre diferentes usuarios:
+
+```ts
+const wallet1 = accounts.get("wallet_1")!;
+const wallet2 = accounts.get("wallet_2")!;
+
+// Wallet 1 deposits
+simnet.callPublicFn("defi", "deposit", [Cl.uint(1000)], wallet1);
+
+// Wallet 2 tries to withdraw wallet 1's funds (should fail)
+const withdrawCall = simnet.callPublicFn(
+ "defi",
+ "withdraw",
+ [Cl.uint(1000)],
+ wallet2
+);
+expect(withdrawCall.result).toBeErr(Cl.uint(401)); // err-unauthorized
+```
+
+## Ejecutando pruebas
+
+Ejecute su conjunto de pruebas:
+
+```terminal
+$ npm test
+```
+
+Generar informes de cobertura:
+
+```terminal
+$ npm run test:coverage
+```
+
+Esto crea un análisis detallado de cobertura y costos para las funciones de tu contrato.
+
+## Uso avanzado
+
+### Uso del SDK en proyectos existentes
+
+Si tienes un proyecto existente de JavaScript/TypeScript con una estructura personalizada, aún puedes utilizar el SDK:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Especifique la ubicación de Clarinet.toml en su configuración de Vitest:
+
+```js vitest.config.js
+export default defineConfig({
+ test: {
+ environment: "node",
+ globals: true,
+ setupFiles: [vitestSetupFilePath],
+ env: {
+ CLARINET_MANIFEST_PATH: "./blockchain/Clarinet.toml"
+ }
+ },
+});
+```
+
+## Próximos pasos
+
+:::next-steps
+* [Pruebas unitarias](/tools/clarinet/unit-testing): Aprende cómo probar tu contrato con pruebas unitarias.
+* [Referencia del SDK](/tools/clarinet/sdk-reference): Aprende más sobre el SDK de JS de Clarinet.
+:::
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx
new file mode 100644
index 000000000..11998a550
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx
@@ -0,0 +1,617 @@
+---
+title: Referencia del SDK de Clarinet JS
+sidebarTitle: Referencia del SDK
+isNew: true
+---
+El SDK de Clarinet JS proporciona una suite completa de métodos para probar e interactuar con contratos inteligentes de Clarity. Desde la inicialización del simnet hasta el despliegue de contratos, el SDK simplifica todo tu flujo de trabajo de pruebas.
+
+* Inicializar una red simulada: [`initSimnet`](#initSimnet)
+* Gestionar el estado del contrato: [`getDataVar`](#getDataVar), [`getMapEntry`](#getMapEntry)
+* Llamar a funciones de contrato: [`callReadOnlyFn`](#callReadOnlyFn), [`callPublicFn`](#callPublicFn)
+* Transferir STX: [`transferSTX`](#transferSTX)
+* Desplegar contratos: [`deployContract`](#deployContract)
+* Mina bloques: [`mineBlock`](#mineBlock), [`mineEmptyBlock`](#mineEmptyBlock)
+* Aserciones personalizadas: [`toBeOk`](#toBeOk), [`toBeErr`](#toBeErr)
+
+## Instalación
+
+```package-install
+@hirosystems/clarinet-sdk
+```
+
+## Inicializar red simulada \[#initalize-simnet]
+
+### iniciarSimnet
+
+`initSimnet` inicializa una red simulada para probar tus contratos inteligentes.
+
+**Uso**
+
+```console
+initSimnet(manifestPath?: string): Promise
+```
+
+```ts -c
+import { initSimnet } from '@hirosystems/clarinet-sdk';
+
+const simnet = await initSimnet();
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `manifestPath` | `string` | Ruta opcional al archivo de manifiesto Clarinet.toml |
+
+## Propiedades de Simnet \[#properties]
+
+### altura del bloque \[#blockHeight]
+
+Devuelve la altura actual del bloque de simnet.
+
+```ts -c
+const currentBlockHeight = simnet.blockHeight;
+// Returns: 1
+```
+
+### desplegador \[#deployer]
+
+Devuelve la dirección del deployer predeterminado según se define en el archivo del proyecto.
+
+```ts -c
+const deployerAddress = simnet.deployer;
+// Returns: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
+```
+
+También puedes actualizar el deployer:
+
+```ts -c
+simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';
+```
+
+### épocaActual \[#épocaActual]
+
+Devuelve la época actual de simnet (por ejemplo, 2.5 para Stacks 2.5).
+
+```ts -c
+const epoch = simnet.currentEpoch;
+// Returns: 2.5
+```
+
+## Gestión de cuenta \[#account-management]
+
+### getAccounts \[#getAccounts]
+
+`getAccounts` recupera todas las direcciones de Stacks configuradas, incluyendo billeteras, implementadores y faucets.
+
+**Uso**
+
+```console
+getAccounts(): Map
+```
+
+```ts -c
+const accounts = simnet.getAccounts();
+const wallet1 = accounts.get('wallet_1')!;
+// Returns: ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5
+```
+
+## Saldos de activos \[#asset-balances]
+
+### getAssetsMap \[#getAssetsMap]
+
+`getAssetsMap` recupera los saldos de activos para todas las direcciones, incluyendo STX, tokens fungibles y no fungibles.
+
+**Uso**
+
+```console
+getAssetsMap(): Map>
+```
+
+```ts -c
+const assets = simnet.getAssetsMap();
+const stxBalances = assets.get('STX')!;
+const deployerBalance = stxBalances.get(simnet.deployer)!;
+// Returns: 100000000000000n
+```
+
+## Leer el estado del contrato \[#state-reading]
+
+### getDataVar \[#getDataVar]
+
+`getDataVar` recupera el valor de una variable de datos de un contrato.
+
+**Uso**
+
+```console
+getDataVar(contract: string, dataVar: string): ClarityValue
+```
+
+```ts -c
+const count = simnet.getDataVar('counter', 'count');
+// Returns: { type: 1, value: 1n }
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `contract` | `string` | Identificador del contrato |
+| `dataVar` | `string` | Nombre de la variable de datos |
+
+### getMapEntry \[#getMapEntry]
+
+`getMapEntry` recupera un valor de un mapa de contrato por su clave.
+
+**Uso**
+
+```console
+getMapEntry(contract: string, mapName: string, mapKey: ClarityValue): ClarityValue
+```
+
+```ts -c
+import { Cl } from '@stacks/transactions';
+
+const hasParticipated = simnet.getMapEntry(
+ "pool",
+ "Participants",
+ Cl.standardPrincipal(wallet)
+);
+// Returns: { type: 10, value: { type: 3 } }
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `contract` | `string` | Identificador del contrato |
+| `mapName` | `string` | Nombre del mapa |
+| `mapKey` | `ClarityValue` | Clave para buscar |
+
+## Llamar a funciones de contrato \[#function-calls]
+
+### callReadOnlyFn \[#callReadOnlyFn]
+
+`callReadOnlyFn` llama a funciones de solo lectura sin minar un bloque.
+
+**Uso**
+
+```console
+callReadOnlyFn(
+ contract: string,
+ method: string,
+ args: ClarityValue[],
+ sender: string
+): ParsedTransactionResult
+```
+
+```ts -c
+import { Cl } from '@stacks/transactions';
+
+const result = simnet.callReadOnlyFn(
+ 'pool',
+ 'get-contribution-amount',
+ [Cl.standardPrincipal(wallet)],
+ wallet
+);
+// Returns: { result: { type: 1, value: 42000000n }, events: [] }
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `contract` | `string` | Identificador del contrato |
+| `method` | `string` | Nombre de la función |
+| `args` | `ClarityValue[]` | Argumentos de función |
+| `sender` | `string` | Dirección del remitente |
+
+### callPublicFn \[#callPublicFn]
+
+`callPublicFn` llama a funciones públicas y mina un bloque.
+
+**Uso**
+
+```console
+callPublicFn(
+ contract: string,
+ method: string,
+ args: ClarityValue[],
+ sender: string
+): ParsedTransactionResult
+```
+
+```ts -c
+import { Cl } from '@stacks/transactions';
+
+const result = simnet.callPublicFn(
+ 'pool',
+ 'register-participant',
+ [Cl.standardPrincipal(wallet)],
+ wallet
+);
+// Mines block and returns result
+```
+
+### callPrivateFn \[#callPrivateFn]
+
+`callPrivateFn` llama a funciones privadas (solo para pruebas) y mina un bloque.
+
+**Uso**
+
+```console
+callPrivateFn(
+ contract: string,
+ method: string,
+ args: ClarityValue[],
+ sender: string
+): ParsedTransactionResult
+```
+
+```ts -c
+const result = simnet.callPrivateFn(
+ "pool",
+ "reward-participant-points",
+ [Cl.standardPrincipal(address1)],
+ wallet
+);
+```
+
+## Transferir STX \[#transferSTX]
+
+`transferSTX` transfiere STX entre direcciones y mina un bloque.
+
+**Uso**
+
+```console
+transferSTX(
+ amount: number | bigint,
+ recipient: string,
+ sender: string
+): ParsedTransactionResult
+```
+
+```ts -c
+const transfer = simnet.transferSTX(
+ 42000000, // 42 STX in microSTX
+ recipient,
+ simnet.deployer
+);
+// Returns transaction result with transfer event
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `amount` | `number \| bigint` | Cantidad en microSTX |
+| `recipient` | `string` | Dirección del destinatario |
+| `sender` | `string` | Dirección del remitente |
+
+## Desplegar contratos \[#deployContract]
+
+`deployContract` despliega un nuevo contrato en simnet y mina un bloque.
+
+**Uso**
+
+```console
+deployContract(
+ name: string,
+ content: string,
+ options: DeployContractOptions | null,
+ sender: string
+): ParsedTransactionResult
+```
+
+```ts -c
+const sourceCode = '(define-read-only (say-hi) (ok "Hello World"))';
+
+const contract = simnet.deployContract(
+ 'hello-world',
+ sourceCode,
+ { clarityVersion: 2 },
+ simnet.deployer
+);
+```
+
+| Parámetro | Tipo | Descripción |
+|-----------|------|-------------|
+| `name` | `string` | Nombre del contrato |
+| `content` | `string` | Código fuente de Clarity |
+| `options` | `object \| null` | Opciones de implementación |
+| `sender` | `string` | Dirección del implementador |
+
+## Minería de bloques \[#block-mining]
+
+### minarBloque \[#mineBlock]
+
+`mineBlock` mina un bloque con múltiples transacciones.
+
+**Uso**
+
+```console
+mineBlock(txs: Tx[]): ParsedTransactionResult[]
+```
+
+```ts -c
+import { tx } from '@hirosystems/clarinet-sdk';
+import { Cl } from '@stacks/transactions';
+
+const block = simnet.mineBlock([
+ tx.callPublicFn("counter", "increment", [], simnet.deployer),
+ tx.transferSTX(19000000, wallet, simnet.deployer),
+]);
+```
+
+### minarBloqueVacío \[#mineEmptyBlock]
+
+`mineEmptyBlock` mina un bloque vacío y aumenta la altura del bloque.
+
+**Uso**
+
+```console
+mineEmptyBlock(): number
+```
+
+```ts -c
+simnet.mineEmptyBlock();
+const newHeight = simnet.blockHeight;
+// Returns: 2
+```
+
+### minarBloquesVacíos \[#mineEmptyBlocks]
+
+`mineEmptyBlocks` mina múltiples bloques vacíos.
+
+**Uso**
+
+```console
+mineEmptyBlocks(count?: number): number
+```
+
+```ts -c
+simnet.mineEmptyBlocks(5);
+const newHeight = simnet.blockHeight;
+// Returns: 6
+```
+
+## Métodos de utilidad \[#utility-methods]
+
+### ejecutarFragmento \[#ejecutarFragmento]
+
+`runSnippet` ejecuta código Clarity arbitrario sin desplegar.
+
+**Uso**
+
+```console
+runSnippet(snippet: string): string | ClarityValue
+```
+
+```ts -c
+const result = simnet.runSnippet('(stx-account tx-sender)');
+// Returns account balance information
+```
+
+### getContractsInterfaces \[#getContractsInterfaces]
+
+`getContractsInterfaces` devuelve interfaces de contrato con firmas de funciones y almacenamiento.
+
+**Uso**
+
+```console
+getContractsInterfaces(): Map
+```
+
+```ts -c
+const interfaces = simnet.getContractsInterfaces();
+const poolInterface = interfaces.get(`${simnet.deployer}.pool`);
+// Returns contract interface with functions, maps, variables
+```
+
+### getContractSource \[#getContractSource]
+
+`getContractSource` recupera el código fuente de un contrato implementado.
+
+**Uso**
+
+```console
+getContractSource(contract: string): string | undefined
+```
+
+```ts -c
+const source = simnet.getContractSource('pool');
+// Returns Clarity source code as string
+```
+
+### getContractAST \[#getContractAST]
+
+`getContractAST` devuelve el Árbol de Sintaxis Abstracta de un contrato.
+
+**Uso**
+
+```console
+getContractAST(contractId: string): ContractAST
+```
+
+```ts -c
+const ast = simnet.getContractAST('pool');
+// Returns parsed AST structure
+```
+
+## Comparadores personalizados \[#custom-matchers]
+
+El SDK proporciona comparadores de Vitest para aserciones de valores de Clarity.
+
+### Comparadores de respuesta \[#response-matchers]
+
+#### toBeOk \[#toBeOk]
+
+Afirma que una respuesta es `(ok )`.
+
+```ts
+expect(result).toBeOk(Cl.uint(1));
+```
+
+#### toBeErr \[#toBeErr]
+
+Afirma que una respuesta es `(err )`.
+
+```ts
+expect(result).toBeErr(Cl.uint(500));
+```
+
+#### toBeSome \[#toBeSome]
+
+Afirma que una respuesta es `(some )`.
+
+```ts
+expect(result).toBeSome(Cl.bool(true));
+```
+
+#### toBeNone \[#toBeNone]
+
+Afirma que una respuesta es `(none)`.
+
+```ts
+expect(result).toBeNone();
+```
+
+### Comparadores de valor \[#value-matchers]
+
+#### toBeBool \[#toBeBool]
+
+Afirma un valor booleano.
+
+```ts
+expect(result).toBeBool(true);
+```
+
+#### toBeInt \[#toBeInt]
+
+Afirma un valor entero con signo.
+
+```ts
+expect(result).toBeInt(1); // or 1n
+```
+
+#### toBeUint \[#toBeUint]
+
+Afirma un valor entero sin signo.
+
+```ts
+expect(result).toBeUint(1); // or 1n
+```
+
+#### toBeAscii \[#toBeAscii]
+
+Afirma un valor de cadena ASCII.
+
+```ts
+expect(result).toBeAscii('Hello World');
+```
+
+#### toBeUtf8 \[#toBeUtf8]
+
+Afirma un valor string-utf8.
+
+```ts
+expect(result).toBeUtf8('Hello World');
+```
+
+#### serPrincipal \[#serPrincipal]
+
+Afirma un valor principal.
+
+```ts
+expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);
+```
+
+#### toBeBuff \[#toBeBuff]
+
+Afirma un valor de búfer.
+
+```ts
+const buffer = Uint8Array.from([1, 2, 3, 4]);
+expect(result).toBeBuff(buffer);
+```
+
+#### Lista de ser \[#toBeList]
+
+Afirma una lista de valores de Clarity.
+
+```ts
+expect(result).toBeList([
+ Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),
+ Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')
+]);
+```
+
+#### toBeTupla \[#toBeTupla]
+
+Afirma un valor de tupla.
+
+```ts
+expect(result).toBeTuple({
+ enrollmentBlock: Cl.some(Cl.uint(1)),
+ contributionAmount: Cl.some(Cl.uint(19000000))
+});
+```
+
+### Comprobación de tipos \[#type-checking]
+
+#### toTenerTipoDeClarity \[#toTenerTipoDeClarity]
+
+Comprueba que un valor tiene el tipo de Clarity esperado.
+
+```ts
+expect(result).toHaveClarityType(ClarityType.ResponseOk);
+```
+
+### Comparadores de eventos \[#event-matchers]
+
+#### toContainEqual \[#toContainEqual]
+
+Afirma que un array de eventos contiene un evento específico. Esto es útil para verificar eventos de transacciones.
+
+```ts
+// STX transfer event
+expect(events).toContainEqual({
+ event: "stx_transfer_event",
+ data: {
+ amount: "1000000",
+ memo: "",
+ recipient: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",
+ sender: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5",
+ },
+});
+
+// Fungible token transfer event
+expect(events).toContainEqual({
+ event: "ft_transfer_event",
+ data: {
+ amount: "1000",
+ asset_identifier: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.token::my-token",
+ recipient: recipientAddress,
+ sender: senderAddress,
+ },
+});
+
+// NFT transfer event
+expect(events).toContainEqual({
+ event: "nft_transfer_event",
+ data: {
+ asset_identifier: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.nft::my-nft",
+ value: Cl.serialize(Cl.uint(1)),
+ recipient: newOwner,
+ sender: previousOwner,
+ },
+});
+
+// Print event
+expect(events).toContainEqual({
+ event: "print_event",
+ data: {
+ contract_id: `${deployer}.my-contract`,
+ value: Cl.serialize(Cl.tuple({ message: Cl.stringAscii("Hello") })),
+ },
+});
+
+// Check only specific properties with objectContaining
+expect(events).toContainEqual({
+ event: "stx_transfer_event",
+ data: expect.objectContaining({
+ sender: senderAddress,
+ recipient: recipientAddress,
+ }),
+});
+```
diff --git a/content/docs/es/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
new file mode 100644
index 000000000..212b86f78
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx
@@ -0,0 +1,217 @@
+---
+title: Escribiendo pruebas unitarias
+sidebarTitle: Pruebas unitarias
+description: El testing unitario es el proceso de probar componentes o funciones individuales de contratos inteligentes para asegurar que funcionen como se espera. El SDK de Clarinet JS proporciona un marco de pruebas que te permite escribir estas pruebas utilizando el framework de testing Vitest, ayudándote a detectar errores y fallos temprano en el proceso de desarrollo.
+---
+import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion';
+
+import { ArrowRight, Check } from 'lucide-react';
+
+## Lo que aprenderás
+
+:::objectives
+* Configurar un proyecto de Clarinet para pruebas unitarias
+* Escribir pruebas unitarias para funciones públicas y de solo lectura
+* Probar condiciones de error y casos límite
+* Ejecutar pruebas y generar informes de cobertura
+:::
+
+## Configura tu proyecto
+
+Comience creando un nuevo proyecto con la CLI de Clarinet. Este comando crea una estructura de proyecto con los archivos y carpetas necesarios, incluyendo el SDK JS de Clarinet ya configurado para pruebas:
+
+```terminal
+$ clarinet new stx-defi
+$ cd stx-defi
+```
+
+Después de cambiar al directorio de su proyecto, instale las dependencias del paquete:
+
+```terminal
+$ npm install
+```
+
+## Crear el contrato
+
+Generar un nuevo archivo de contrato utilizando la CLI de Clarinet:
+
+```terminal
+$ clarinet contract new defi
+```
+
+Reemplace el contenido de `contracts/defi.clar` con este contrato DeFi:
+
+```clarity contracts/defi.clar
+;; Holds the total amount of deposits in the contract
+(define-data-var total-deposits uint u0)
+
+;; Maps a user's principal address to their deposited amount
+(define-map deposits { owner: principal } { amount: uint })
+
+;; Public function for users to deposit STX into the contract
+(define-public (deposit (amount uint))
+ (let
+ (
+ ;; Fetch the current balance or default to 0 if none exists
+ (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))
+ )
+ ;; Transfer the STX from sender to contract
+ (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
+ ;; Update the user's deposit amount in the map
+ (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })
+ ;; Update the total deposits variable
+ (var-set total-deposits (+ (var-get total-deposits) amount))
+ ;; Return success
+ (ok true)
+ )
+)
+
+;; Read-only function to get the balance by tx-sender
+(define-read-only (get-balance-by-sender)
+ (ok (map-get? deposits { owner: tx-sender }))
+)
+```
+
+Correr `clarinet check` para garantizar que su contrato sea válido:
+
+```terminal
+$ clarinet check
+[32m✔ 1 contract checked[0m
+```
+
+## Escriba su prueba unitaria
+
+Las pruebas clave que queremos cubrir son que el depósito sea exitoso y que el saldo del usuario, así como los depósitos totales del contrato, se actualicen correctamente.
+
+Reemplace el contenido de `tests/defi.test.ts`:
+
+```typescript tests/defi.test.ts
+import { describe, it, expect } from 'vitest';
+import { Cl } from '@stacks/transactions';
+
+const accounts = simnet.getAccounts();
+const wallet1 = accounts.get('wallet_1')!;
+
+describe('stx-defi', () => {
+ it('allows users to deposit STX', () => {
+ // Define the amount to deposit
+ const amount = 1000;
+
+ // Call the deposit function
+ const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);
+
+ // Assert the deposit was successful
+ expect(deposit.result).toBeOk(Cl.bool(true));
+
+ // Verify the contract's total deposits
+ const totalDeposits = simnet.getDataVar('defi', 'total-deposits');
+ expect(totalDeposits).toBeUint(amount);
+
+ // Check the user's balance
+ const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);
+ expect(balance.result).toBeOk(
+ Cl.some(
+ Cl.tuple({
+ amount: Cl.uint(amount),
+ })
+ )
+ );
+ });
+});
+```
+
+Analicemos las partes clave de esta prueba:
+
+* **`simnet.callPublicFn`** - Llama a una función pública en tu contrato
+* **`expect().toBeOk()`** - Comparador personalizado que verifica la claridad `ok` respuesta
+* **`simnet.getDataVar`** - Recupera el valor de una variable de datos
+* **`Cl` ayudantes** - Crear valores de Clarity en JavaScript
+
+## Pruébalo
+
+Ejecuta tu prueba para verla en acción:
+
+```terminal
+$ npm run test
+ PASS tests/defi.test.ts
+ stx-defi
+ allows users to deposit STX (5 ms)
+
+Test Files 1 passed (1)
+ Tests 1 passed (1)
+```
+
+## Problemas comunes
+
+| Problema | Solución |
+|----------|----------|
+| `toBeOk is not a function` | Asegúrese de estar utilizando los comparadores personalizados del SDK |
+| `Contract not found` | Correr `clarinet check` para validar su contrato |
+| `Type errors` | Utilice el `Cl` ayudantes para crear valores de Clarity adecuados |
+
+
+
+ Generar informes de cobertura
+
+
+
+ Ejecutar pruebas con cobertura para identificar código no probado:
+
+ ```terminal
+ $ npm run test:report
+ ```
+
+ Esto genera:
+
+ * `lcov.info` - Datos de cobertura de código
+ * `costs-reports.json` - Análisis de costo de gas
+
+ Para ver el informe de cobertura:
+
+ ```terminal
+ $ brew install lcov
+ $ genhtml lcov.info --branch-coverage -o coverage
+ $ open coverage/index.html
+ ```
+
+
+
+
+
+ Patrones de pruebas avanzados
+
+
+
+ Probar condiciones de error:
+
+ ```typescript
+ it('fails when depositing zero', () => {
+ const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(0)], wallet1);
+ expect(deposit.result).toBeErr(Cl.uint(100)); // err-invalid-amount
+ });
+ ```
+
+ Prueba con múltiples cuentas:
+
+ ```typescript
+ const wallet2 = accounts.get('wallet_2')!;
+
+ it('tracks deposits from multiple users', () => {
+ simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);
+ simnet.callPublicFn('defi', 'deposit', [Cl.uint(2000)], wallet2);
+
+ const total = simnet.getDataVar('defi', 'total-deposits');
+ expect(total).toBeUint(3000);
+ });
+ ```
+
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Pruebas de integración](/tools/clarinet/integration-testing): Aprende cómo probar tu contrato con pruebas de integración.
+* [Simulación de ejecución de la red principal](/tools/clarinet/mainnet-execution-simulation): Aprende cómo probar tu contrato con el estado de la red principal.
+:::
diff --git a/content/docs/es/tools/clarinet/(integrations)/chainhook-integration.mdx b/content/docs/es/tools/clarinet/(integrations)/chainhook-integration.mdx
new file mode 100644
index 000000000..534192999
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(integrations)/chainhook-integration.mdx
@@ -0,0 +1,164 @@
+---
+title: Registrar Chainhooks en devnet
+sidebarTitle: Integración de Chainhook
+description: En esta guía, aprenderás cómo registrar Chainhooks en devnet para monitorear y reaccionar a eventos de contratos inteligentes durante el desarrollo local.
+---
+## Lo que aprenderás
+
+:::objectives
+* Crear archivos de predicado Chainhook para monitoreo de eventos
+* Registrar Chainhooks con Clarinet devnet
+* Monitorear llamadas de contrato y eventos de blockchain
+* Configurar webhooks para notificaciones en tiempo real
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Se requiere Clarinet versión 2.1.0 o superior. Verificar con `clarinet --version`.
+* Se requiere Node.js versión 16 o superior. Verifique con `node --version`.
+:::
+
+## Inicio rápido
+
+
+
+ ### Crea tus predicados de Chainhook
+
+ Crea archivos de predicado Chainhook en la raíz de tu proyecto o en una carpeta dedicada:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ejemplo de predicado para monitorear eventos de incremento:
+
+ ```json chainhooks/increment.json
+ {
+ "chain": "stacks",
+ "uuid": "increment-hook",
+ "name": "Increment Counter Hook",
+ "version": 1,
+ "networks": {
+ "devnet": {
+ "if_this": {
+ "scope": "contract_call",
+ "contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter",
+ "method": "increment"
+ },
+ "then_that": {
+ "http_post": {
+ "url": "http://localhost:3000/api/increment",
+ "authorization_header": "Bearer my-secret"
+ }
+ }
+ }
+ }
+ }
+ ```
+
+
+
+ ### Iniciar devnet con Chainhooks
+
+ Inicie devnet desde la raíz de su proyecto. Clarinet registra automáticamente todos los archivos Chainhook:
+
+ ```terminal
+ $ clarinet devnet start
+ ```
+
+ Busque la confirmación de registro:
+
+ ```terminal
+ $ clarinet devnet start
+ # ...
+ INFO Feb 5 15:20:07.233382 2 chainhooks registered
+ ```
+
+
+
+ ### Monitorear la actividad de Chainhook
+
+ Cuando se producen acciones de contrato, verás los disparadores de Chainhook en la terminal:
+
+ ```terminal
+ $ clarinet devnet start
+ # ...
+ INFO Feb 5 15:21:07.233382 1 hooks triggered
+ ```
+
+ Verifique la carga útil según su `then_that` configuration:
+
+ * **`http_post`** - Verifica que tu endpoint haya recibido la solicitud POST
+ * **`file_append`** - Verificar que el archivo fue creado/actualizado
+
+
+
+## Patrones comunes
+
+### Gancho de despliegue de contrato
+
+Monitorear cuándo se implementan contratos específicos:
+
+```json chainhooks/deploy-monitor.json
+{
+ "chain": "stacks",
+ "uuid": "deploy-hook",
+ "name": "Contract Deploy Monitor",
+ "version": 1,
+ "networks": {
+ "devnet": {
+ "if_this": {
+ "scope": "contract_deployment",
+ "deployer": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM"
+ },
+ "then_that": {
+ "file_append": {
+ "path": "./deployments.log"
+ }
+ }
+ }
+ }
+}
+```
+
+### Monitoreo de transferencias STX
+
+Rastrea las transferencias de STX por encima de un cierto umbral:
+
+```json chainhooks/stx-transfers.json
+{
+ "chain": "stacks",
+ "uuid": "stx-transfer-hook",
+ "name": "Large STX Transfer Monitor",
+ "version": 1,
+ "networks": {
+ "devnet": {
+ "if_this": {
+ "scope": "stx_event",
+ "actions": ["transfer"],
+ "amount_upper_bound": "1000000000000"
+ },
+ "then_that": {
+ "http_post": {
+ "url": "http://localhost:3000/api/large-transfer"
+ }
+ }
+ }
+ }
+}
+```
diff --git a/content/docs/es/tools/clarinet/(integrations)/pyth-oracle-integration.mdx b/content/docs/es/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
new file mode 100644
index 000000000..fe9af5ba8
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(integrations)/pyth-oracle-integration.mdx
@@ -0,0 +1,378 @@
+---
+title: Integración del oráculo Pyth
+sidebarTitle: Integración del oráculo Pyth
+description: Aprende cómo probar contratos inteligentes que dependen de los feeds de precios del oráculo Pyth utilizando Clarinet.
+---
+## Lo que aprenderás
+
+:::objectives
+* Configurar las dependencias del contrato de mainnet
+* Utilizar la ejecución de transacciones de mainnet (MXS) para pruebas de oráculos
+* Crear feeds de precios simulados para pruebas unitarias
+* Escribir pruebas de integración con datos reales de oracle
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Versión 2.1.0 o superior de Clarinet con soporte MXS
+* Comprensión de [Contratos de oráculo de Pyth](/resources/clarity/external-data)
+:::
+
+## Inicio rápido
+
+
+
+ ### Configurar dependencias de mainnet
+
+ Agregue los contratos de oráculo Pyth a sus requisitos de Clarinet.toml:
+
+ ```toml Clarinet.toml
+ [project]
+ name = "my-oracle-project"
+
+ [[project.requirements]]
+ contract_id = "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3"
+
+ [[project.requirements]]
+ contract_id = "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3"
+
+ [[project.requirements]]
+ contract_id = "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-pnau-decoder-v2"
+
+ [[project.requirements]]
+ contract_id = "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.wormhole-core-v3"
+ ```
+
+ Esto permite que tus pruebas interactúen con los contratos de oráculo reales de la red principal.
+
+
+
+ ### Crear un oráculo simulado para pruebas unitarias
+
+ Para pruebas unitarias rápidas, cree un contrato de oráculo simulado:
+
+ ```clarity tests/mocks/mock-pyth-oracle.clar
+ ;; Mock Pyth Oracle for testing
+ (define-map price-feeds
+ (buff 32) ;; price-feed-id
+ {
+ price: int,
+ conf: uint,
+ expo: int,
+ ema-price: int,
+ ema-conf: uint,
+ publish-time: uint,
+ prev-publish-time: uint
+ }
+ )
+
+ ;; Set a mock price
+ (define-public (set-mock-price
+ (feed-id (buff 32))
+ (price int)
+ (expo int))
+ (ok (map-set price-feeds feed-id {
+ price: price,
+ conf: u1000000,
+ expo: expo,
+ ema-price: price,
+ ema-conf: u1000000,
+ publish-time: block-height,
+ prev-publish-time: (- block-height u1)
+ }))
+ )
+
+ ;; Mock get-price function matching real oracle interface
+ (define-read-only (get-price
+ (feed-id (buff 32))
+ (storage-contract principal))
+ (ok (unwrap!
+ (map-get? price-feeds feed-id)
+ (err u404)))
+ )
+
+ ;; Mock verify-and-update-price-feeds (no-op for testing)
+ (define-public (verify-and-update-price-feeds
+ (vaa (buff 8192))
+ (params (tuple)))
+ (ok u1)
+ )
+ ```
+
+
+
+ ### Escribir pruebas unitarias con precios simulados
+
+ Crear pruebas unitarias utilizando el oráculo simulado:
+
+ ```typescript tests/benjamin-club.test.ts
+ import { Cl } from '@stacks/transactions';
+ import { describe, expect, it } from "vitest";
+
+ const accounts = simnet.getAccounts();
+ const deployer = accounts.get("deployer")!;
+ const wallet1 = accounts.get("wallet_1")!;
+
+ describe("Benjamin Club with Mock Oracle", () => {
+ it("should set up mock BTC price", () => {
+ // Set BTC price to $100,000 (with 8 decimals)
+ const btcFeedId = "0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43";
+ const mockPrice = Cl.int(10000000000000); // $100,000.00 * 10^8
+ const expo = Cl.int(-8);
+
+ const setPriceResponse = simnet.callPublicFn(
+ "mock-pyth-oracle",
+ "set-mock-price",
+ [Cl.bufferFromHex(btcFeedId), mockPrice, expo],
+ deployer
+ );
+
+ expect(setPriceResponse.result).toBeOk(Cl.uint(1));
+ });
+
+ it("should calculate correct sBTC amount for $100", () => {
+ // With BTC at $100,000, $100 = 0.001 BTC
+ const response = simnet.callReadOnlyFn(
+ "benjamin-club",
+ "get-required-sbtc-amount",
+ [],
+ wallet1
+ );
+
+ // 0.001 BTC = 100,000 sats
+ expect(response.result).toBeOk(Cl.uint(100000));
+ });
+
+ it("should mint NFT when user has enough sBTC", () => {
+ // Mock VAA data (can be dummy data for unit tests)
+ const mockVaa = Cl.bufferFromHex("00".repeat(100));
+
+ // Give user 1 BTC worth of sBTC
+ simnet.callPublicFn(
+ "sbtc-token",
+ "mint",
+ [Cl.uint(100000000), Cl.principal(wallet1)],
+ deployer
+ );
+
+ const mintResponse = simnet.callPublicFn(
+ "benjamin-club",
+ "mint-for-hundred-dollars",
+ [mockVaa],
+ wallet1
+ );
+
+ expect(mintResponse.result).toBeOk(Cl.uint(1));
+ });
+ });
+ ```
+
+
+
+ ### Configurar pruebas de ejecución de mainnet
+
+ Para pruebas de integración con datos reales de oracle, utilice la ejecución de transacciones de mainnet:
+
+ ```typescript tests/benjamin-club-mxs.test.ts
+ import { buildDevnetNetworkOrchestrator } from "@hirosystems/clarinet-sdk";
+ import { Cl } from '@stacks/transactions';
+ import { PriceServiceConnection } from '@pythnetwork/price-service-client';
+ import { describe, expect, it } from "vitest";
+
+ describe("Benjamin Club with Mainnet Oracle", () => {
+ let orchestrator: any;
+
+ beforeAll(async () => {
+ orchestrator = buildDevnetNetworkOrchestrator({
+ // Point to a mainnet fork
+ manifest: "./Clarinet.toml",
+ networkId: 1 // Mainnet
+ });
+ });
+
+ it("should interact with real Pyth oracle", async () => {
+ // Fetch real VAA from Pyth
+ const pythClient = new PriceServiceConnection(
+ "https://hermes.pyth.network",
+ { priceFeedRequestConfig: { binary: true } }
+ );
+
+ const btcFeedId = "e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43";
+ const vaas = await pythClient.getLatestVaas([btcFeedId]);
+ const vaaHex = Buffer.from(vaas[0], 'base64').toString('hex');
+
+ // Use mainnet execution to test with real oracle
+ const response = await orchestrator.callPublicFn(
+ "benjamin-club",
+ "get-current-btc-price",
+ [Cl.bufferFromHex(vaaHex)],
+ "wallet_1"
+ );
+
+ expect(response.result).toBeOk();
+
+ // Verify price is reasonable (between $10k and $200k)
+ const priceData = response.result.value;
+ const price = priceData.data.price.value;
+ expect(price).toBeGreaterThan(1000000000000); // $10k
+ expect(price).toBeLessThan(20000000000000); // $200k
+ });
+ });
+ ```
+
+
+
+## Patrones comunes
+
+### Probando diferentes escenarios de precios
+
+Crear funciones auxiliares para probar diversas condiciones del mercado:
+
+```typescript tests/helpers/oracle-helpers.ts
+export function setupPriceScenario(
+ scenario: 'bull' | 'bear' | 'stable',
+ simnet: any
+) {
+ const prices = {
+ bull: {
+ btc: 15000000000000, // $150,000
+ stx: 500000000, // $5.00
+ eth: 500000000000 // $5,000
+ },
+ bear: {
+ btc: 2000000000000, // $20,000
+ stx: 50000000, // $0.50
+ eth: 100000000000 // $1,000
+ },
+ stable: {
+ btc: 10000000000000, // $100,000
+ stx: 200000000, // $2.00
+ eth: 300000000000 // $3,000
+ }
+ };
+
+ const selectedPrices = prices[scenario];
+
+ // Set up all price feeds
+ Object.entries(selectedPrices).forEach(([asset, price]) => {
+ const feedId = getFeedId(asset);
+ simnet.callPublicFn(
+ "mock-pyth-oracle",
+ "set-mock-price",
+ [Cl.bufferFromHex(feedId), Cl.int(price), Cl.int(-8)],
+ "deployer"
+ );
+ });
+}
+```
+
+### Probando la obsolescencia de precios
+
+Asegúrate de que tu contrato maneje correctamente los precios obsoletos:
+
+```typescript tests/price-staleness.test.ts
+describe("Price Staleness Handling", () => {
+ it("should reject stale prices", () => {
+ // Set a price with old timestamp
+ const oldTimestamp = simnet.getBlockHeight() - 1000;
+
+ simnet.callPublicFn(
+ "mock-pyth-oracle",
+ "set-price-with-timestamp",
+ [
+ Cl.bufferFromHex(BTC_FEED_ID),
+ Cl.int(10000000000000),
+ Cl.int(-8),
+ Cl.uint(oldTimestamp)
+ ],
+ deployer
+ );
+
+ const response = simnet.callPublicFn(
+ "benjamin-club",
+ "mint-for-hundred-dollars",
+ [mockVaa],
+ wallet1
+ );
+
+ expect(response.result).toBeErr(Cl.uint(ERR_STALE_PRICE));
+ });
+});
+```
+
+### Pruebas de implementación
+
+Crear pruebas de implementación para garantizar una configuración adecuada:
+
+```toml deployments/mainnet.yaml
+---
+id: 0
+name: "Mainnet deployment"
+network: mainnet
+stacks-node: "https://api.mainnet.hiro.so"
+bitcoin-node: "https://blockstream.info/api/"
+plan:
+ batches:
+ - id: 0
+ transactions:
+ - contract-call:
+ contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRCBGD7R.benjamin-club
+ method: initialize
+ parameters:
+ - "'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-oracle-v3"
+ - "'SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3"
+```
+
+### Estimación de gas
+
+Probar el consumo de gas para operaciones de oráculo:
+
+```typescript tests/gas-estimation.test.ts
+describe("Gas Estimation", () => {
+ it("should estimate gas for oracle update + mint", () => {
+ const txCost = simnet.getTransactionCost(
+ "benjamin-club",
+ "mint-for-hundred-dollars",
+ [Cl.bufferFromHex("00".repeat(1000))], // Typical VAA size
+ wallet1
+ );
+
+ console.log("Estimated gas cost:", txCost);
+
+ // Ensure gas cost is reasonable
+ expect(txCost.write_length).toBeLessThan(20000);
+ expect(txCost.runtime).toBeLessThan(50000000);
+ });
+});
+```
+
+## Integración de CI/CD
+
+Configurar GitHub Actions para pruebas automatizadas:
+
+```yaml .github/workflows/test-oracle.yml
+name: Test Oracle Integration
+
+on: [push, pull_request]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Clarinet
+ run: |
+ curl -L https://github.com/hirosystems/clarinet/releases/download/v2.1.0/clarinet-linux-x64.tar.gz | tar xz
+ chmod +x ./clarinet
+ sudo mv ./clarinet /usr/local/bin
+
+ - name: Run unit tests
+ run: clarinet test --coverage
+
+ - name: Run mainnet fork tests
+ run: clarinet test --mainnet-fork
+ env:
+ MAINNET_API_KEY: ${{ secrets.MAINNET_API_KEY }}
+```
diff --git a/content/docs/es/tools/clarinet/(integrations)/sbtc-integration.mdx b/content/docs/es/tools/clarinet/(integrations)/sbtc-integration.mdx
new file mode 100644
index 000000000..ec9e7db6b
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(integrations)/sbtc-integration.mdx
@@ -0,0 +1,270 @@
+---
+title: Integración de sBTC con Clarinet
+sidebarTitle: Integración de sBTC
+description: En esta guía, aprenderás cómo interactuar con el contrato sBTC de la red principal en tu proyecto de Clarinet.
+---
+## Lo que aprenderás
+
+:::objectives
+* Agregar contratos inteligentes de sBTC a su proyecto de Clarinet
+* Probar contratos con financiación automática de sBTC en devnet
+* Trabajar con sBTC como un token fungible SIP-010
+* Desplegar contratos de sBTC en testnet y mainnet
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Se requiere Clarinet 2.15.0 o posterior para la integración automática de sBTC.
+:::
+
+## Inicio rápido
+
+
+
+ ### Añade sBTC a tu proyecto
+
+ Agregue los contratos inteligentes de sBTC a los requisitos de su proyecto Clarinet:
+
+ ```terminal
+ $ clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit
+ ```
+
+ Este comando agrega tres contratos esenciales:
+
+ * **`sbtc-token`** - El contrato de token SIP-010 principal
+ * **`sbtc-registry`** - Registro para gestionar la configuración de sBTC
+ * **`sbtc-deposit`** - Maneja operaciones de depósito y retiro
+
+ Cuando Clarinet detecta estos contratos, automáticamente financia sus billeteras de prueba con sBTC para realizar pruebas.
+
+
+
+ ### Crear un contrato habilitado para sBTC
+
+ Construye un mercado simple de NFT que acepte pagos en sBTC:
+
+ ```clarity contracts/nft-marketplace.clar
+ ;; Define NFT
+ (define-non-fungible-token marketplace-nft uint)
+
+ ;; Price in sats (smallest sBTC unit)
+ (define-data-var mint-price uint u100)
+ (define-data-var next-id uint u0)
+
+ ;; Mint NFT with sBTC payment
+ (define-public (mint-with-sbtc)
+ (begin
+ ;; Transfer sBTC from buyer to contract
+ (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token transfer
+ (var-get mint-price)
+ tx-sender
+ (as-contract tx-sender)
+ none
+ ))
+
+ ;; Mint the NFT
+ (try! (nft-mint? marketplace-nft (var-get next-id) tx-sender))
+
+ ;; Increment ID for next mint
+ (ok (var-set next-id (+ (var-get next-id) u1)))
+ )
+ )
+
+ ;; Check sBTC balance
+ (define-read-only (get-sbtc-balance (owner principal))
+ (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token get-balance owner)
+ )
+ ```
+
+
+
+ ### Probar en la consola de Clarinet
+
+ Clarinet financia automáticamente las billeteras de prueba con sBTC. Prueba tu contrato:
+
+ ```terminal
+ $ clarinet console
+ ```
+
+ Verifique los saldos de la billetera y acuñe un NFT:
+
+ ```clarity
+ ;; Check deployer's sBTC balance (auto-funded)
+ (contract-call? .nft-marketplace get-sbtc-balance tx-sender)
+
+ ;; Mint NFT with wallet_1 (also auto-funded)
+ (contract-call? .nft-marketplace mint-with-sbtc)
+
+ ;; Verify NFT ownership
+ (nft-get-owner? .nft-marketplace marketplace-nft u0)
+ ```
+
+
+
+ ### Escribir pruebas unitarias
+
+ Prueba la funcionalidad de sBTC en tus pruebas de TypeScript:
+
+ ```ts tests/nft-marketplace.test.ts
+ import { describe, expect, it } from "vitest";
+ import { Cl } from "@stacks/transactions";
+
+ describe("NFT Marketplace", () => {
+ it("mints NFT with sBTC payment", () => {
+ const mintPrice = 100;
+
+ // Get initial sBTC balance
+ const initialBalance = simnet.callReadOnlyFn(
+ "nft-marketplace",
+ "get-sbtc-balance",
+ [Cl.standardPrincipal(accounts.get("wallet_1")!.address)],
+ accounts.get("wallet_1")!.address
+ );
+
+ // Mint NFT
+ const mintResult = simnet.callPublicFn(
+ "nft-marketplace",
+ "mint-with-sbtc",
+ [],
+ accounts.get("wallet_1")!.address
+ );
+
+ expect(mintResult.result).toBeOk();
+
+ // Verify sBTC was transferred
+ const finalBalance = simnet.callReadOnlyFn(
+ "nft-marketplace",
+ "get-sbtc-balance",
+ [Cl.standardPrincipal(accounts.get("wallet_1")!.address)],
+ accounts.get("wallet_1")!.address
+ );
+
+ expect(Number(Cl.parse(finalBalance.result))).toBeLessThan(
+ Number(Cl.parse(initialBalance.result))
+ );
+ });
+ });
+ ```
+
+
+
+ ### Desplegar en testnet
+
+ En la red de pruebas, Clarinet automáticamente se reasigna a los contratos oficiales de sBTC de Hiro:
+
+ ```terminal
+ $ clarinet deployments generate --testnet
+ ```
+
+ Su plan de implementación muestra las direcciones reasignadas:
+
+ ```yaml deployments/default.testnet-plan.yaml
+ ---
+ id: 0
+ name: Testnet deployment
+ network: testnet
+ stacks-node: "https://api.testnet.hiro.so"
+ bitcoin-node: "http://blockstream.info"
+ plan:
+ batches:
+ - id: 0
+ transactions:
+ - requirement-publish:
+ contract-id: ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token
+ remap-sender: SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4
+ remap-principals:
+ SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4: ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT
+ cost: 50000
+ path: "./.cache/requirements/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token.clar"
+ ```
+
+ Desplegar en testnet:
+
+ ```terminal
+ $ clarinet deployments apply -p deployments/default.testnet-plan.yaml
+ ```
+
+
+
+## Patrones comunes
+
+## Trabajando con direcciones sBTC
+
+Clarinet maneja el mapeo de direcciones de contratos sBTC a través de las redes:
+
+| Red | Dirección del Contrato sBTC |
+|---------|---------------------|
+| Simnet/Devnet | `SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token` |
+| Red de pruebas | `ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token` |
+| Mainnet | La dirección del contrato permanece sin cambios |
+
+Su código de contrato siempre hace referencia a la dirección de simnet. Clarinet automáticamente reasigna durante el despliegue.
+
+## Minting manual de sBTC en pruebas unitarias
+
+Aunque Clarinet 2.15.0+ financia automáticamente las billeteras con sBTC en devnet, es posible que necesite acuñar manualmente sBTC en pruebas unitarias para escenarios específicos:
+
+### Acuñando sBTC utilizando la dirección del implementador
+
+El contrato de token sBTC permite que la dirección del implementador (multisig) acuñe tokens. Utiliza este enfoque en tus pruebas:
+
+```typescript tests/manual-sbtc-mint.test.ts -c
+import { describe, expect, it } from "vitest";
+import { Cl } from "@stacks/transactions";
+
+describe("Manual sBTC minting", () => {
+ it("mints sBTC to custom addresses", () => {
+ // The sBTC multisig address that can mint
+ const sbtcDeployer = "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4";
+ const customWallet = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM";
+
+ // Mint 1000 sats to custom wallet
+ const mintResult = simnet.callPublicFn(
+ "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token",
+ "mint",
+ [
+ Cl.uint(1000), // amount in sats
+ Cl.principal(customWallet) // recipient
+ ],
+ sbtcDeployer // sender must be deployer
+ );
+
+ expect(mintResult.result).toBeOk(Cl.bool(true));
+
+ // Verify balance
+ const balance = simnet.callReadOnlyFn(
+ "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token",
+ "get-balance",
+ [Cl.principal(customWallet)],
+ customWallet
+ );
+
+ expect(balance.result).toBeOk(Cl.uint(1000));
+ });
+});
+```
+
+### Pruebas con simulación de ejecución en la red principal
+
+Cuando se utiliza la simulación de ejecución en la red principal, se puede acuñar sBTC utilizando la multifirma real de la red principal:
+
+```typescript -c
+const mainnetMultisig = "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4";
+const mainnetWallet = "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR";
+
+// Mint sBTC to any mainnet address
+simnet.callPublicFn(
+ "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token",
+ "mint",
+ [Cl.uint(100000), Cl.principal(mainnetWallet)],
+ mainnetMultisig
+);
+```
+
+Este enfoque es útil para:
+
+* Probando cantidades específicas de sBTC
+* Simulando diferentes saldos de billetera
+* Probando casos límite con cantidades de tokens precisas
+* Pruebas de integración con contratos de mainnet
diff --git a/content/docs/es/tools/clarinet/(integrations)/stacks-js-integration.mdx b/content/docs/es/tools/clarinet/(integrations)/stacks-js-integration.mdx
new file mode 100644
index 000000000..b61bf4aba
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(integrations)/stacks-js-integration.mdx
@@ -0,0 +1,245 @@
+---
+title: Integración de Stacks.js con devnet
+sidebarTitle: Integración de Stacks.js
+description: En esta guía, aprenderás cómo interactuar con tus contratos inteligentes en devnet utilizando las bibliotecas de Stacks.js.
+---
+## Lo que aprenderás
+
+:::objectives
+* Configurar Stacks.js para conexión a devnet local
+* Realizar transferencias STX entre cuentas de devnet
+* Llamar a funciones de contratos inteligentes desde JavaScript
+* Implementar contratos de forma programática
+:::
+
+## Inicio rápido
+
+
+
+ ### Instalar paquetes de Stacks.js
+
+ Agregue los paquetes requeridos de Stacks.js a su proyecto frontend:
+
+ ```package-install
+ @stacks/transactions @stacks/network
+ ```
+
+
+
+ ### Configurar para devnet
+
+ Configurar una configuración de red devnet:
+
+ ```ts devnet-config.ts
+ import { StacksDevnet } from '@stacks/network';
+
+ // Configure for local devnet
+ export const devnet = new StacksDevnet({
+ url: 'http://localhost:3999'
+ });
+
+ // Get devnet accounts (matches Clarinet wallets)
+ export const accounts = {
+ deployer: {
+ address: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
+ key: 'cb3df38053d132895220b9ce471f6b676db5b9bf0b4adefb55f2118ece2478df01'
+ },
+ wallet1: {
+ address: 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5',
+ key: '7287ba251d44a4d3fd9276c88ce34c5c52a038955511cccaf77e61068649c17801'
+ }
+ };
+ ```
+
+
+
+ ### Prueba de transferencias STX
+
+ Cree una transferencia STX simple entre cuentas de devnet:
+
+ ```ts stx-transfer.ts
+ import { makeSTXTokenTransfer, broadcastTransaction, AnchorMode } from '@stacks/transactions';
+ import { devnet, accounts } from './devnet-config';
+
+ async function transferSTX() {
+ const tx = await makeSTXTokenTransfer({
+ amount: 1000000n, // 1 STX in microSTX
+ recipient: accounts.wallet1.address,
+ senderKey: accounts.deployer.key,
+ network: devnet,
+ anchorMode: AnchorMode.Any,
+ });
+
+ const result = await broadcastTransaction(tx, devnet);
+ console.log('Transaction ID:', result.txid);
+
+ // Transaction will be mined in next devnet block
+ return result.txid;
+ }
+
+ transferSTX().catch(console.error);
+ ```
+
+ Ejecute la transferencia:
+
+ ```terminal
+ $ ts-node stx-transfer.ts
+ Transaction ID: 0x3d5f8a70c4821e0f8c985b1f5b9d77f8c4b6d1a2e7f9c3b8a4d5e6f1c8d9b7a3
+ ```
+
+
+
+ ### Llamar a contratos inteligentes
+
+ Interactúa con contratos implementados en devnet:
+
+ ```ts contract-call.ts
+ import { makeContractCall, broadcastTransaction, AnchorMode, Cl } from '@stacks/transactions';
+ import { devnet, accounts } from './devnet-config';
+
+ async function callContract() {
+ const tx = await makeContractCall({
+ contractAddress: accounts.deployer.address,
+ contractName: 'counter',
+ functionName: 'increment',
+ functionArgs: [],
+ senderKey: accounts.wallet1.key,
+ network: devnet,
+ anchorMode: AnchorMode.Any,
+ });
+
+ const result = await broadcastTransaction(tx, devnet);
+ console.log('Contract call ID:', result.txid);
+
+ return result.txid;
+ }
+
+ // Read contract state
+ async function readCount() {
+ const response = await fetch(
+ `${devnet.coreApiUrl}/v2/contracts/call-read/${accounts.deployer.address}/counter/get-count`,
+ {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ sender: accounts.wallet1.address,
+ arguments: []
+ })
+ }
+ );
+
+ const data = await response.json();
+ console.log('Current count:', data.result);
+ }
+
+ callContract()
+ .then(() => readCount())
+ .catch(console.error);
+ ```
+
+
+
+ ### Desplegar contratos desde el frontend
+
+ Desplegar nuevos contratos en devnet de forma programática:
+
+ ```ts deploy-contract.ts
+ import { makeContractDeploy, broadcastTransaction, AnchorMode } from '@stacks/transactions';
+ import { devnet, accounts } from './devnet-config';
+
+ async function deployContract() {
+ const contractCode = `
+ (define-data-var count uint u0)
+
+ (define-public (increment)
+ (ok (var-set count (+ (var-get count) u1)))
+ )
+
+ (define-read-only (get-count)
+ (var-get count)
+ )
+ `;
+
+ const tx = await makeContractDeploy({
+ contractName: 'my-counter',
+ codeBody: contractCode,
+ senderKey: accounts.deployer.key,
+ network: devnet,
+ anchorMode: AnchorMode.Any,
+ });
+
+ const result = await broadcastTransaction(tx, devnet);
+ console.log('Contract deployed:', result.txid);
+
+ return result.txid;
+ }
+
+ deployContract().catch(console.error);
+ ```
+
+
+
+## Patrones comunes
+
+### Esperando la confirmación de la transacción
+
+Monitorear cuándo se confirman las transacciones en devnet:
+
+```ts transaction-monitor.ts
+async function waitForTransaction(txid: string) {
+ let attempts = 0;
+ const maxAttempts = 10;
+
+ while (attempts < maxAttempts) {
+ const response = await fetch(
+ `${devnet.coreApiUrl}/extended/v1/tx/${txid}`
+ );
+
+ const tx = await response.json();
+
+ if (tx.tx_status === 'success') {
+ console.log('Transaction confirmed!');
+ return tx;
+ }
+
+ if (tx.tx_status === 'abort_by_response') {
+ throw new Error(`Transaction failed: ${tx.tx_result.repr}`);
+ }
+
+ // Wait for next block
+ await new Promise(resolve => setTimeout(resolve, 5000));
+ attempts++;
+ }
+
+ throw new Error('Transaction timeout');
+}
+```
+
+### Condiciones posteriores para la seguridad
+
+Agregar condiciones posteriores para garantizar que las llamadas al contrato se comporten según lo esperado:
+
+```ts safe-transfer.ts
+import { Pc } from '@stacks/transactions';
+
+const postConditions = [
+ // Ensure sender's balance decreases by exactly the amount
+ Pc.principal(accounts.wallet1.address)
+ .willSendEq(1000000n)
+ .ustx(),
+
+ // Ensure recipient receives the amount
+ Pc.principal(accounts.deployer.address)
+ .willReceiveEq(1000000n)
+ .ustx()
+];
+
+const tx = await makeSTXTokenTransfer({
+ amount: 1000000n,
+ recipient: accounts.deployer.address,
+ senderKey: accounts.wallet1.key,
+ network: devnet,
+ postConditions,
+ anchorMode: AnchorMode.Any,
+});
+```
diff --git a/content/docs/es/tools/clarinet/(overview)/faq.mdx b/content/docs/es/tools/clarinet/(overview)/faq.mdx
new file mode 100644
index 000000000..f8482a9ab
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(overview)/faq.mdx
@@ -0,0 +1,211 @@
+---
+title: Preguntas frecuentes
+sidebarTitle: Preguntas frecuentes
+description: Preguntas comunes y soluciones para el desarrollo de Clarinet
+---
+Esta página aborda preguntas y problemas comunes encontrados al desarrollar con Clarinet, basados en comentarios de la comunidad e interacciones de soporte.
+
+## Pruebas y desarrollo
+
+
+
+ ¿Cómo puedo probar con tokens sBTC en mi entorno de desarrollo?
+
+
+
+ Para probar con tokens sBTC, añade el contrato sBTC de la red principal como requisito y acuña tokens usando la dirección del desplegador:
+
+ **Paso 1: Agregar sBTC como requisito**
+
+ ```terminal
+ $ clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token
+ ```
+
+ **Paso 2: Acuñar sBTC en tus pruebas**
+
+ ```typescript
+ // The sBTC multisig address that can mint
+ const sbtcDeployer = "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4";
+
+ // Mint sBTC to your test wallet
+ const mintTx = simnet.callPublicFn(
+ "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token",
+ "mint",
+ [Cl.uint(1000000), Cl.principal(wallet1)],
+ sbtcDeployer
+ );
+ ```
+
+ Este enfoque te permite trabajar con sBTC en pruebas unitarias sin una simulación compleja de transacciones de Bitcoin.
+
+
+
+
+
+ ¿Por qué estoy recibiendo un error al usar direcciones de mainnet durante la simulación de mainnet?
+
+
+
+ Al utilizar la simulación de ejecución en la red principal, es posible que el contrato de la red principal esté verificando las llamadas de contrato de direcciones de la red principal, no las direcciones de la red de prueba.
+
+ **A partir de Clarinet v3.4.0**, puedes habilitar direcciones de mainnet en simnet agregando `use_mainnet_wallets = true` a tu configuración:
+
+ ```toml Clarinet.toml
+ [repl.remote_data]
+ enabled = true
+ initial_height = 522000
+ use_mainnet_wallets = true # Enable mainnet addresses
+ ```
+
+ **Alternativa: Usar manualmente direcciones de mainnet:**
+
+ ```typescript
+ // Instead of using simnet.getAccounts()
+ const mainnetAddress = "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY";
+
+ // Mint STX to any mainnet address
+ simnet.mintSTX(mainnetAddress, 1000000n);
+
+ // Call functions with mainnet address
+ const result = simnet.callReadOnlyFn(
+ "SP3R4F6C1J3JQWWCVZ3S7FRRYPMYG6ZW6RZK31FXY.pyth-storage-v3",
+ "get-price",
+ [priceFeed],
+ mainnetAddress
+ );
+ ```
+
+ La simnet es permisiva y acepta cualquier dirección válida de Stacks cuando la simulación de mainnet está habilitada.
+
+
+
+
+
+ ¿Cómo migro de expectSTXTransferEvent al nuevo SDK?
+
+
+
+ El SDK de Clarinet v2 utiliza comparadores estándar de Vitest en lugar de ayudantes de eventos personalizados. Así es cómo migrar:
+
+ **Enfoque antiguo (Clarinet v1):**
+
+ ```typescript
+ block.receipts[0].events.expectSTXTransferEvent(
+ amount,
+ sender,
+ recipient
+ );
+ ```
+
+ **Nuevo enfoque (Clarinet v2):**
+
+ ```typescript
+ // Check for exact event match
+ expect(events).toContainEqual({
+ event: "stx_transfer_event",
+ data: {
+ amount: "1000000",
+ memo: "",
+ recipient: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",
+ sender: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5",
+ },
+ });
+
+ // Or check only specific properties
+ expect(events).toContainEqual({
+ event: "stx_transfer_event",
+ data: expect.objectContaining({
+ sender: address1,
+ recipient: contractAddress,
+ }),
+ });
+ ```
+
+ Para las aserciones de valor de Clarity, utiliza los comparadores incorporados:
+
+ ```typescript
+ expect(result).toBeOk(Cl.bool(true));
+ expect(result).toBeErr(Cl.uint(500));
+ ```
+
+
+
+
+
+## Configuración e instalación
+
+
+
+ ¿Por qué estoy recibiendo "error bip39" al generar planes de implementación?
+
+
+
+ A partir de Clarinet 2.15.0, las configuraciones de implementación requieren mnemotécnicas de 24 palabras. Las mnemotécnicas de 12 palabras ya no son compatibles.
+
+ **Actualice su configuración:**
+
+ ```toml settings/Mainnet.toml
+ [accounts.deployer]
+ # Use a 24-word mnemonic
+ mnemonic = "twice kind fence tip hidden tilt action fragile skin nothing glory cousin green tomorrow spring wrist shed math olympic multiply hip blue scout claw"
+ ```
+
+ Genere una nueva mnemotecnia de 24 palabras usando un generador BIP39 si es necesario. Este cambio mejora la seguridad para implementaciones en producción.
+
+
+
+
+
+## Limitaciones conocidas
+
+
+
+ ¿Puedo probar la verificación de transacciones de Bitcoin en Clarinet?
+
+
+
+ Probar contratos que utilizan clarity-bitcoin-lib para la verificación de transacciones de Bitcoin tiene limitaciones en simnet y devnet:
+
+ **Limitaciones actuales:**
+
+ * No hay bloques ni transacciones reales de Bitcoin en simnet
+ * Los bloques simulados no contienen transacciones de Bitcoin verificables
+ * `get-burn-block-info?` devuelve datos simulados no aptos para verificación
+
+ **Soluciones alternativas:**
+
+ * Probar la lógica de verificación de Bitcoin en la red principal o con simulación de ejecución de la red principal
+ * Crear pruebas unitarias que simulen el comportamiento esperado sin verificación real
+ * Considere separar la lógica de verificación de Bitcoin para facilitar las pruebas
+
+ El equipo de Clarinet está explorando soluciones para un mejor soporte de pruebas de Bitcoin.
+
+
+
+
+
+ ¿Por qué mi devnet se congela en la transición de la época 3.0?
+
+
+
+ La transición de época 3.0 en devnet puede ser inestable, con tasas de éxito que varían entre el 50-80% dependiendo de tu configuración.
+
+ **Soluciones temporales actuales:**
+
+ * Reinicie devnet si se congela alrededor de los bloques 139-140
+ * Prueba Clarinet 2.14.0, que algunos usuarios informan que es más estable
+ * Espera a que la próxima función comience devnet directamente en la época 3.0
+
+ **Monitoreando la transición:**
+
+ ```console
+ # Watch for the transition around these blocks
+ Block 139: Epoch 2.5
+ Block 140: Should transition to 3.0
+ ```
+
+ El equipo de Clarinet está trabajando en mejorar la estabilidad de la transición de época y planea permitir iniciar devnet directamente en la época 3.0.
+
+
+
+
diff --git a/content/docs/es/tools/clarinet/(overview)/project-structure.mdx b/content/docs/es/tools/clarinet/(overview)/project-structure.mdx
new file mode 100644
index 000000000..d4331506e
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(overview)/project-structure.mdx
@@ -0,0 +1,291 @@
+---
+title: Estructura del proyecto
+sidebarTitle: Estructura del proyecto
+description: Comprender la estructura y configuración completa de un proyecto de Clarinet
+type: concept
+---
+Un proyecto de Clarinet sigue una estructura cuidadosamente diseñada que separa contratos, pruebas y configuración. Comprender esta estructura te ayuda a organizar el código de manera efectiva y configurar herramientas para un flujo de trabajo de desarrollo óptimo.
+
+## Diseño del proyecto principal
+
+Cada proyecto de Clarinet contiene estos directorios y archivos esenciales:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Cada componente cumple un propósito específico en su flujo de trabajo de desarrollo. Exploremos cómo funcionan juntos para crear un entorno de desarrollo completo.
+
+## El manifiesto del proyecto
+
+### Clarinet.toml
+
+El **Clarinet.toml** file es el corazón de tu proyecto. Define los metadatos del proyecto y rastrea todos los contratos:
+
+```toml Clarinet.toml
+[project]
+name = "counter"
+description = "A counter smart contract"
+
+[contracts.traits]
+path = "contracts/traits.clar"
+clarity_version = 3
+epoch = "latest"
+
+[contracts.counter]
+path = 'contracts/counter.clar'
+clarity_version = 3
+epoch = "latest"
+```
+
+El manifiesto maneja varias funciones críticas:
+
+* **Registro de contrato**: Todo contrato debe estar listado aquí
+* **Época de Stacks y versión de Clarity**: Especifica la versión de Clarity y la época para cada contrato
+* **Secuencia de arranque**: Enumera los contratos a desplegar `clarinet devnet start`
+
+### Configuración de época
+
+Puedes especificar la época de dos maneras:
+
+```toml
+# Use a specific epoch version
+epoch = 3.1
+
+# Use the latest available epoch (default)
+epoch = "latest"
+```
+
+Usando `"latest"` garantiza que tus contratos siempre utilicen las características y optimizaciones de Clarity más recientes disponibles en tu versión de Clarinet.
+
+## Infraestructura de pruebas
+
+### Configuración del paquete
+
+El **package.json** define su entorno de pruebas y dependencias:
+
+```json package.json
+{
+ "name": "counter-tests",
+ "version": "1.0.0",
+ "description": "Run unit tests on this project.",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "test": "vitest run",
+ "test:report": "vitest run -- --coverage --costs",
+ "test:watch": "chokidar \"tests/**/*.ts\" \"contracts/**/*.clar\" -c \"npm run test:report\""
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "@hirosystems/clarinet-sdk": "^3.0.2",
+ "@stacks/transactions": "^7.0.6",
+ "@types/node": "^24.0.14",
+ "chokidar-cli": "^3.0.0",
+ "vitest": "^3.1.3",
+ "vitest-environment-clarinet": "^2.3.0"
+ }
+}
+```
+
+| Paquete | Propósito |
+|---------|---------|
+| `@hirosystems/clarinet-sdk` | WebAssembly-compilado Clarinet para Node.js |
+| `@stacks/transactions` | Manipulación de valores de Clarity en TypeScript |
+| `vitest` | Marco de pruebas moderno con soporte nativo para TypeScript |
+| `vitest-environment-clarinet` | Arranque de Simnet para pruebas |
+
+### Configuración de Vitest
+
+El **vitest.config.js** configura el marco de pruebas:
+
+```js vitest.config.js
+///
+import { defineConfig } from "vite";
+import { vitestSetupFilePath, getClarinetVitestsArgv } from "@hirosystems/clarinet-sdk/vitest";
+
+export default defineConfig({
+ test: {
+ environment: "clarinet", // use vitest-environment-clarinet
+ pool: "forks",
+ poolOptions: {
+ threads: { singleThread: true },
+ forks: { singleFork: true },
+ },
+ setupFiles: [
+ vitestSetupFilePath,
+ // custom setup files can be added here
+ ],
+ environmentOptions: {
+ clarinet: {
+ ...getClarinetVitestsArgv(),
+ // add or override options
+ },
+ },
+ },
+});
+```
+
+Esta configuración habilita:
+
+* **Entorno de Clarinet**: Automático `simnet` configuración para cada prueba
+* **Modo de bifurcación única**: Ejecución eficiente de pruebas con aislamiento adecuado
+* **Seguimiento de cobertura**: Generar informes en múltiples formatos
+* **Configuración personalizada**: Agregar utilidades de prueba específicas del proyecto
+
+### Configuración de TypeScript
+
+El **tsconfig.json** proporciona soporte para TypeScript:
+
+```json tsconfig.json
+
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ESNext"],
+ "skipLibCheck": true,
+
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+
+ "strict": true,
+ "noImplicitAny": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ // !mark(1:4)
+ "include": [
+ "node_modules/@hirosystems/clarinet-sdk/vitest-helpers/src",
+ "tests"
+ ]
+}
+```
+
+Es importante configurar correctamente la propiedad include, por defecto apunta a los archivos de ayuda definidos en el paquete clarinet-sdk, y al directorio de pruebas.
+
+## Configuraciones de red
+
+### Configuración del entorno
+
+Cada red tiene su propio archivo de configuración en el **configuración** directorio:
+
+```toml settings/Devnet.toml
+[network]
+name = "devnet"
+deployment_fee_rate = 10
+
+[accounts.deployer]
+mnemonic = "twice kind fence tip hidden..."
+balance = 100_000_000_000_000
+
+[accounts.wallet_1]
+mnemonic = "sell invite acquire kitten..."
+balance = 10_000_000_000_000
+```
+
+Estos ajustes controlan:
+
+* **Puertos de red**: Puntos finales de API, RPC y explorador
+* **Configuración de cuenta**: Carteras de prueba con saldos de STX
+* **Parámetros de la cadena**: Configuración específica de la cadena de bloques de la red
+
+:::callout
+type: warn
+
+### Aviso de Seguridad
+
+Nunca comprometas claves privadas o frases mnemónicas de la red principal. Utiliza variables de entorno para las credenciales de producción.
+:::
+
+## Problemas comunes
+
+
+
+ Importaciones fallando en pruebas
+
+
+
+ Si estás encontrando errores de importación en tus pruebas, actualiza tu configuración de TypeScript para usar la resolución del empaquetador de Vite:
+
+ ```json tsconfig.json
+ {
+ "compilerOptions": {
+ "moduleResolution": "bundler", // !mark
+ "allowImportingTsExtensions": true
+ }
+ }
+ ```
+
+ Esta configuración asegura que TypeScript comprenda la estrategia de resolución de módulos de Vite y permita la importación `.ts` archivos directamente.
+
+
+
+
+
+ Versiones incompatibles
+
+
+
+ Todos los contratos en su proyecto deben usar la misma versión y época de Clarity para evitar problemas de compatibilidad:
+
+ ```toml Clarinet.toml
+ [contracts.token]
+ clarity_version = 3
+ epoch = "latest" # !mark
+
+ [contracts.pool]
+ clarity_version = 3
+ epoch = "latest" # !mark
+ ```
+
+ Las versiones incompatibles pueden causar fallos en la implementación y comportamientos inesperados. Siempre actualice todos los contratos juntos cuando se cambie a una nueva versión de Clarity.
+
+
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Escribiendo contratos de Clarity](/tools/clarinet/project-development): Crea y gestiona contratos de Clarity.
+* [Pruebas y validación](/tools/clarinet/contract-interaction): Interactúa con contratos Clarity en tu proyecto.
+:::
diff --git a/content/docs/es/tools/clarinet/(overview)/quickstart.mdx b/content/docs/es/tools/clarinet/(overview)/quickstart.mdx
new file mode 100644
index 000000000..5a718927a
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(overview)/quickstart.mdx
@@ -0,0 +1,165 @@
+---
+title: Inicio rápido
+description: En esta guía, construirás un contrato inteligente de contador simple e interactuarás con él en un entorno local.
+---
+## Lo que aprenderás
+
+:::objectives
+* Crear un proyecto de contrato inteligente en Clarity
+* Escribir código Clarity con mapas y funciones públicas
+* Prueba y valida tus contratos utilizando la consola de Clarinet
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Clarinet instalado en tu máquina. Sigue el [guía de instalación](/tools/clarinet#installation) si es necesario.
+* Un editor de código como VS Code para editar archivos de Clarity.
+:::
+
+## Inicio rápido
+
+
+
+ ### Crea tu proyecto
+
+ Comencemos creando un nuevo proyecto de Clarinet. El `clarinet new` el comando configura todo lo que necesitas para el desarrollo de contratos inteligentes, incluyendo un marco de pruebas, configuraciones de implementación y un entorno de desarrollo local:
+
+ ```terminal
+ $ clarinet new counter
+ [32mCreate directory[0m [1mcounter[0m
+ [32mCreate directory[0m [1mcontracts[0m
+ [32mCreate directory[0m [1msettings[0m
+ [32mCreate directory[0m [1mtests[0m
+ [32mCreate file[0m [1mClarinet.toml[0m
+ [32mCreate file[0m [1mpackage.json[0m
+ [32mCreate file[0m [1mvitest.config.js[0m
+ ```
+
+ Clarinet crea una estructura de proyecto completa para ti. Cada carpeta tiene un propósito específico en tu flujo de trabajo de desarrollo:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ### Genera tu contrato
+
+ Ahora que tenemos nuestra estructura de proyecto, vamos a crear un contrato inteligente. Navega a tu directorio de proyecto y utiliza el generador de contratos de Clarinet:
+
+ ```terminal
+ $ cd counter
+ $ clarinet contract new counter
+ [32mCreated file[0m [1mcontracts/counter.clar[0m
+ [32mCreated file[0m [1mtests/counter.test.ts[0m
+ [33mUpdated Clarinet.toml[0m [1mwith contract counter[0m
+ ```
+
+ Clarinet crea automáticamente tanto su archivo de contrato como un archivo de prueba correspondiente. Esto sigue la mejor práctica de escribir pruebas junto con su código de contrato:
+
+ | Archivo | Propósito |
+ |------|---------|
+ | `contracts/counter.clar` | Tu código de contrato inteligente |
+ | `tests/counter.test.ts` | Archivo de prueba para su contrato |
+
+ :::callout
+ Observe que Clarinet también actualizó su `Clarinet.toml` archivo. Este archivo de configuración rastrea todos los contratos en su proyecto y sus ajustes de implementación.
+ :::
+
+
+
+ ### Escriba el código de su contrato
+
+ Abrir `contracts/counter.clar` y reemplazar su contenido con nuestra implementación del contador. Este contrato mantendrá un conteo separado para cada usuario que interactúe con él:
+
+ ```clarity contracts/counter.clar -c
+ ;; Define a map to store counts for each user
+ (define-map counters principal uint)
+
+ ;; Increment the count for the caller
+ (define-public (count-up)
+ (ok (map-set counters tx-sender (+ (get-count tx-sender) u1)))
+ )
+
+ ;; Get the current count for a user
+ (define-read-only (get-count (who principal))
+ (default-to u0 (map-get? counters who))
+ )
+ ```
+
+ Entendamos qué hace cada parte:
+
+ * [`define-map`](/resources/clarity/reference/functions#define-map) crea un mapa de almacenamiento persistente que asocia a cada usuario (principal) con su conteo
+ * [`tx-sender`](/resources/clarity/reference/keywords#tx-sender) es una variable incorporada que contiene la dirección de quien llama a la función
+ * [`define-public`](/resources/clarity/reference/functions#define-public) declara funciones que pueden modificar el estado del contrato
+ * [`define-read-only`](/resources/clarity/reference/functions#define-read-only) declara funciones que solo leen datos sin modificarlos
+
+
+
+ ### Valide su contrato
+
+ Antes de poder probar nuestro contrato, asegurémonos de que sea sintácticamente correcto y seguro en cuanto a tipos. El comando check de Clarinet analiza tu contrato sin desplegarlo:
+
+ ```terminal
+ $ clarinet check
+ [32m✔[0m [1m1 contract checked[0m
+ ```
+
+ Si ve errores en su lugar, estos son los problemas más comunes y cómo solucionarlos:
+
+ | Error | Solución |
+ |-------|-----|
+ | `Unknown keyword` | Verificar la ortografía de las funciones de Clarity |
+ | `Type mismatch` | Asegúrate de usar los tipos correctos (uint, principal, etc.) |
+ | `Unresolved contract` | Verificar el nombre del contrato en `Clarinet.toml` coincide con el nombre del contrato en el archivo |
+
+
+
+ ### Prueba en la consola
+
+ Ahora viene la parte emocionante: ¡interactuemos con nuestro contrato! Clarinet proporciona una consola interactiva donde puedes llamar funciones y ver resultados inmediatamente. Inicia la consola con:
+
+ ```terminal
+ $ clarinet console
+ ```
+
+ Una vez que la consola se carga, puedes llamar a las funciones de tu contrato directamente. Aquí hay algunos ejemplos que puedes probar:
+
+ ```terminal
+ $ (contract-call? .counter count-up)
+ [32m(ok true)[0m
+ $ (contract-call? .counter get-count tx-sender)
+ [32mu1[0m
+ $ (contract-call? .counter count-up)
+ [32m(ok true)[0m
+ $ (contract-call? .counter get-count tx-sender)
+ [32mu2[0m
+ ```
+
+
+
+## Próximos pasos
+
+:::next-steps
+* [Estructura del proyecto](/tools/clarinet/project-structure): Aprende sobre la estructura del proyecto y cómo gestionar tus contratos.
+* [Desarrollo de blockchain local](/tools/clarinet/local-blockchain-development): Inicia una cadena de bloques local para probar tus contratos.
+:::
diff --git a/content/docs/es/tools/clarinet/(vscode-extension)/vscode-extension.mdx b/content/docs/es/tools/clarinet/(vscode-extension)/vscode-extension.mdx
new file mode 100644
index 000000000..0e7e3ff91
--- /dev/null
+++ b/content/docs/es/tools/clarinet/(vscode-extension)/vscode-extension.mdx
@@ -0,0 +1,102 @@
+---
+title: Extensión de VS Code
+sidebarTitle: Introducción
+description: La extensión Clarity para VS Code transforma tu editor en un potente entorno de desarrollo de contratos inteligentes. Obtienes resaltado de sintaxis, autocompletado, depuración y verificación de errores en tiempo real.
+---
+## Características
+
+### Autocompletado inteligente
+
+La extensión proporciona autocompletado de código inteligente que comprende el contexto de Clarity. Cuando comienzas a escribir cualquier función de Clarity, obtienes sugerencias instantáneas con documentación:
+
+```clarity
+;; Type "stx-tr" and get:
+(stx-transfer? amount sender recipient)
+;; ^ ^ ^
+;; Placeholders for easy navigation
+```
+
+Usar `Tab` para saltar entre marcadores de posición y `Escape` para salir del modo de marcador de posición.
+
+### Documentación al pasar el cursor
+
+Accede a documentación completa sin salir de tu editor. Pasa el cursor sobre cualquier función o palabra clave de Clarity para ver:
+
+```clarity
+;; Hover over 'map-set' to see:
+;; - Function signature
+;; - Parameter descriptions
+;; - Return type
+;; - Usage examples
+(map-set my-map {key: "value"} "data")
+```
+
+### Definición de referencia
+
+Navega por tu base de código de manera eficiente con las funciones de salto a definición:
+
+* `F12` o `Ctrl+Click` - Ir a la definición
+* `Alt+F12` - Ver la definición sin salir del archivo actual
+* Funciona en archivos de contrato y llamadas de contrato
+
+### Comprobación de errores en tiempo real
+
+La extensión valida tu código continuamente, proporcionando retroalimentación inmediata:
+
+* **Subrayados rojos** - Errores de sintaxis, palabras clave desconocidas
+* **Garabatos amarillos** - Advertencias para código potencialmente inseguro
+* **Lista de errores** - Todos los problemas en el panel Problemas (`Ctrl+Shift+M`)
+
+Los errores comunes detectados incluyen variables no definidas, incompatibilidades de tipos, implementaciones de rasgos faltantes y firmas de funciones inválidas.
+
+### Resolución de contratos locales
+
+La autocompletación funciona en todo tu proyecto. Haz referencia a funciones de otros contratos en tu espacio de trabajo:
+
+```clarity
+;; Auto-complete local contract calls
+(contract-call? .my-token transfer amount sender recipient)
+;; ^
+;; Suggests contracts in your project
+```
+
+### Soporte de rasgos
+
+Al implementar rasgos (como NFTs SIP-009 o tokens SIP-010), la extensión verifica:
+
+* Todas las funciones requeridas están implementadas
+* Las firmas de función coinciden con las definiciones de rasgos
+* Los tipos de retorno son correctos
+
+```clarity
+;; Extension warns if missing required trait functions
+(impl-trait .sip-010-trait.sip-010-trait)
+
+;; ⚠️ Warning: Missing required function 'get-balance'
+```
+
+### Depuración visual
+
+La extensión incluye un depurador visual para la ejecución de código paso a paso:
+
+1. Establece puntos de interrupción haciendo clic en los números de línea
+2. Presionar `F5` o usa Ejecutar → Iniciar depuración
+3. Recorre el código línea por línea
+4. Inspeccionar variables y estado de la pila
+
+:::callout
+### Requisitos
+
+La depuración visual requiere VS Code Desktop y Clarinet instalados localmente.
+:::
+
+## Tabla de comparación
+
+| Característica | Editor Básico | Extensión de VS Code |
+|----------------|----------------|------------------------|
+| Resaltado de sintaxis | Limitado | Soporte completo de Clarity |
+| Autocompletado | Ninguno | Contextual con documentación |
+| Verificación de errores | Solo al desplegar | Validación en tiempo real |
+| Documentación | Búsqueda externa | Documentación emergente en línea |
+| Depuración | Solo consola | Depurador visual |
+| Navegación entre archivos | Manual | Salto a definición |
diff --git a/content/docs/es/tools/clarinet/index.mdx b/content/docs/es/tools/clarinet/index.mdx
new file mode 100644
index 000000000..5ef713996
--- /dev/null
+++ b/content/docs/es/tools/clarinet/index.mdx
@@ -0,0 +1,59 @@
+---
+title: Clarinet
+sidebarTitle: Visión general
+description: Clarinet es todo lo que necesitas para escribir, probar e implementar contratos inteligentes de Clarity en Stacks.
+type: overview
+llm: false
+---
+## Visión general
+
+Clarinet is the fastest way to build, test, and deploy smart contracts on the Stacks blockchain. It gives you a local devnet, REPL, testing framework, and debugging tools to ship high-quality Clarity code with confidence.
+
+
+
+Para explorar las funciones de Clarinet con IA, copie y pegue [llms.txt](/tools/clarinet/llms.txt) en tu LLM de elección.
+
+## Características principales
+
+* [**Aproveche una potente interfaz de línea de comandos**](/tools/clarinet/cli-reference) - Create new projects, manage your smart contracts and their dependencies using clarinet requirements, and interact with your code through the built-in REPL.
+* [**Escribir pruebas unitarias con el SDK**](/tools/clarinet/sdk-introduction) - Utiliza el SDK de Clarinet para escribir pruebas unitarias en un entorno JS familiar y validar el comportamiento del contrato.
+* [**Ejecutar un entorno de blockchain privado**](/tools/clarinet/local-blockchain-development) - Inicia una devnet local con nodos, mineros y APIs para que puedas probar e integrar tu código.
+* [**Extensión de VSCode**](/tools/clarinet/vscode-extension) - Linter, depurador paso a paso, ayuda a escribir contratos inteligentes (autocompletación, documentación, etc.).
+
+## Instalación
+
+
+ ```terminal !! macOS
+ $ brew install clarinet
+ ```
+
+ ```terminal !! Windows
+ $ winget install clarinet
+ ```
+
+ ```terminal !! Cargo
+ $ sudo apt install build-essential pkg-config libssl-dev
+ ```
+
+ ```terminal !! Binary
+ $ wget -nv https://github.com/hirosystems/clarinet/releases/latest/download/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz
+ $ tar -xf clarinet-linux-x64.tar.gz
+ $ chmod +x ./clarinet
+ $ mv ./clarinet /usr/local/bin
+ ```
+
+
+## Próximos pasos
+
+:::next-steps
+* [Inicio rápido](/tools/clarinet/quickstart): Comienza con Clarinet.
+* [Crear un proyecto](/tools/clarinet/project-development): Crear un nuevo proyecto de Clarinet.
+:::
+
+:::callout
+type: help
+
+### ¿Necesitas ayuda para construir con Clarinet?
+
+Contáctenos en el **#clarinet** canal activado [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro. También hay una [horario de oficina semanal](https://www.addevent.com/event/kI22007085) llamada todos los miércoles a la 1 pm ET.
+:::
diff --git a/content/docs/es/tools/clarinet/meta.json b/content/docs/es/tools/clarinet/meta.json
new file mode 100644
index 000000000..008ac3413
--- /dev/null
+++ b/content/docs/es/tools/clarinet/meta.json
@@ -0,0 +1,17 @@
+{
+ "title": "Clarinet",
+ "root": true,
+ "pages": [
+ "---Clarinet---",
+ "index",
+ "...(overview)",
+ "---Clarinet CLI---",
+ "...(clarinet-cli)",
+ "---Clarinet JS SDK---",
+ "...(clarinet-js-sdk)",
+ "---VSCode Extension---",
+ "...(vscode-extension)",
+ "---Integrations---",
+ "...(integrations)"
+ ]
+}
diff --git a/content/docs/es/tools/contract-monitoring/create-alert.mdx b/content/docs/es/tools/contract-monitoring/create-alert.mdx
new file mode 100644
index 000000000..cc3b2f5ab
--- /dev/null
+++ b/content/docs/es/tools/contract-monitoring/create-alert.mdx
@@ -0,0 +1,179 @@
+---
+title: Crear una alerta
+description: Aprende cómo crear una alerta para monitorear las llamadas a funciones de un contrato.
+---
+## Lo que aprenderás
+
+:::objectives
+* Configurar alertas para funciones de contrato
+* Configurar notificaciones por correo electrónico y webhook
+* Monitorear patrones de uso de contratos
+:::
+
+## Requisitos previos
+
+:::prerequisites
+* Contratos implementados en la red principal de Stacks (o use cualquier contrato público)
+* Una cuenta de la Plataforma Hiro - [Regístrate gratis](https://platform.hiro.so)
+:::
+
+## Configurar el monitoreo de contratos
+
+
+
+ ### Navegar a monitoreo
+
+ Inicie sesión en el [Plataforma Hiro](https://platform.hiro.so) y cambia a la **Monitor** pestaña.
+
+ Puedes configurar monitoreo de alertas para cualquier contrato en la red principal.
+
+
+
+ ### Agregar contrato para monitoreo
+
+ Hacer clic **Agregar contrato** para abrir el modal de búsqueda de contratos.
+
+ Tienes dos opciones:
+
+ * **Entrada manual**: Ingrese el principal del contrato y el nombre del contrato
+ * **Conexión de billetera**: Conecta tu billetera para ver tu historial de implementación
+
+ Todos los contratos implementados en la red principal son públicos, por lo que puedes monitorear cualquiera de ellos independientemente de quién los haya implementado.
+
+
+
+ ### Ver actividad del contrato
+
+ Una vez agregado, su contrato aparece en Monitoreo de Contratos donde puede:
+
+ * Ver historial de transacciones
+ * Ver transacciones pendientes en el mempool
+ * Hacer clic **Crear una alerta** para configurar un monitoreo específico
+
+
+
+ ### Configurar alertas personalizadas
+
+ Configura alertas para cualquier llamada a función de contrato con condiciones específicas:
+
+ * **Función llamada**: Alertar cuando se llama a una función específica
+ * **Con argumentos**: Alertar solo cuando se llame con valores de argumento especificados
+ * **Por dirección**: Alertar solo cuando sea llamado por una dirección de billetera específica
+
+ Por ejemplo, monitorear `set-contract-owner`, funciones de transferencia/acuñación/quemado, o cualquier función personalizada que hayas implementado.
+
+
+
+ ### Elegir método de notificación
+
+ Seleccione cómo desea recibir alertas:
+
+ * **Notificaciones por correo electrónico**: Reciba alertas en su dirección de correo electrónico
+ * **Llamadas de webhook**: Envía a tu punto final de API para flujos de trabajo personalizados
+
+ Puede habilitar varios métodos de notificación para la misma alerta.
+
+
+
+## Formato de carga útil de alerta
+
+Las notificaciones por correo electrónico provienen de Hiro Platform ``.
+
+Los payloads de webhook siguen esta estructura:
+
+
+ ```json !! sample.json
+ {
+ "tx_id": "0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5",
+ "nonce": 5,
+ "fee_rate": "250",
+ "sender_address": "SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z",
+ "sponsored": false,
+ "post_condition_mode": "deny",
+ "post_conditions": [
+ {
+ "type": "stx",
+ "condition_code": "sent_equal_to",
+ "amount": "3000000",
+ "principal": {
+ "type_id": "principal_standard",
+ "address": "SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z"
+ }
+ }
+ ],
+ "anchor_mode": "any",
+ "tx_status": "pending",
+ "receipt_time": 1726104636,
+ "receipt_time_iso": "2024-09-12T01:30:36.000Z",
+ "tx_type": "contract_call",
+ "contract_call": {
+ "contract_id": "SPHW0EJK5KPDMK03ZX792EMP0Q5J3A39ZMTVZZCY.sample-contract",
+ "function_name": "donate",
+ "function_signature": "(define-public (donate (amount uint)))",
+ "function_args": [
+ {
+ "hex": "0x01000000000000000000000000002dc6c0",
+ "repr": "u3000000",
+ "name": "amount",
+ "type": "uint"
+ }
+ ]
+ }
+ }
+ ```
+
+ ```ts !! alert-payload.ts
+ interface AlertPayload {
+ tx_id: string;
+ nonce: number;
+ fee_rate: string;
+ sender_address: string;
+ sponsored: boolean;
+ post_condition_mode: string;
+ post_conditions: PostCondition[];
+ anchor_mode: string;
+ tx_status: string;
+ receipt_time: number;
+ receipt_time_iso: string;
+ tx_type: string;
+ contract_call: ContractCall;
+ }
+
+ interface ContractCall {
+ contract_id: string;
+ function_name: string;
+ function_signature: string;
+ function_args: FunctionArg[];
+ }
+
+ interface FunctionArg {
+ hex: string;
+ repr: string;
+ name: string;
+ type: string;
+ }
+
+ interface PostCondition {
+ type: string;
+ condition_code: string;
+ amount: string;
+ principal: Principal;
+ }
+
+ interface Principal {
+ type_id: string;
+ address: string;
+ }
+ ```
+
+
+:::callout
+El `tx_status` siempre devolverá "pending" para las alertas de monitoreo. Las notificaciones se envían cuando las transacciones llegan al mempool, no cuando se confirman en la blockchain.
+:::
+
+## Próximos pasos
+
+:::next-steps
+* [Plataforma Hiro](https://platform.hiro.so): Crea y gestiona nuevos webhooks en la Plataforma.
+* [Chainhook](/tools/chainhook): Aprende sobre el monitoreo avanzado de eventos con Chainhook
+:::
diff --git a/content/docs/es/tools/contract-monitoring/index.mdx b/content/docs/es/tools/contract-monitoring/index.mdx
new file mode 100644
index 000000000..388a0883f
--- /dev/null
+++ b/content/docs/es/tools/contract-monitoring/index.mdx
@@ -0,0 +1,29 @@
+---
+title: Monitoreo de contratos
+sidebarTitle: Visión general
+description: El monitoreo de contratos le permite rastrear eventos de contratos inteligentes en tiempo real y recibir notificaciones por webhook cuando ocurren actividades específicas.
+llm: false
+---
+## Visión general
+
+Para explorar las funciones de monitoreo de contratos con IA, copie y pegue [llms.txt](/tools/contract-monitoring/llms.txt) en tu LLM de elección.
+
+## Características principales
+
+* **Notificaciones en tiempo real** - Apunta a eventos específicos y recibe webhooks en cuestión de segundos
+* **Configuración sin código** - Configurar monitores a través de la interfaz de usuario de la plataforma sin escribir código
+
+## Próximos pasos
+
+:::next-steps
+* [Crear una alerta](/tools/contract-monitoring/create-alert): Configure su primera alerta para llamadas a funciones.
+* [Chainhooks](/tools/chainhook): Aprende más sobre Chainhooks y cómo se diferencian del monitoreo de contratos.
+:::
+
+:::callout
+type: help
+
+### ¿Necesita ayuda con el monitoreo de contratos?
+
+Contáctenos en el #api canal encendido [Discord](https://stacks.chat/) bajo la sección de Herramientas para Desarrolladores de Hiro.
+:::
diff --git a/content/docs/es/tools/contract-monitoring/meta.json b/content/docs/es/tools/contract-monitoring/meta.json
new file mode 100644
index 000000000..43ccb70f4
--- /dev/null
+++ b/content/docs/es/tools/contract-monitoring/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Contract Monitoring",
+ "root": true,
+ "pages": ["---Contract Monitoring---", "index", "create-alert"]
+}
diff --git a/content/docs/resources/archive/meta.json b/content/docs/resources/archive/meta.json
deleted file mode 100644
index 5f3960677..000000000
--- a/content/docs/resources/archive/meta.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "title": "Hiro Archive",
- "root": true,
- "pages": ["index", "verify-archive-data", "stacks-blockchain", "stacks-api", "token-metadata-api"]
-}
diff --git a/content/docs/resources/archive/verify-archive-data.mdx b/content/docs/resources/archive/verify-archive-data.mdx
deleted file mode 100644
index fc0f92623..000000000
--- a/content/docs/resources/archive/verify-archive-data.mdx
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: Verify archive data
-description: Verify the integrity of the data in a particular snapshot.
----
-
-All datasets have an associated SHA256 hash file which can be used to verify the integrity of the downloaded dataset.
-As some of the archives are quite large, this is useful to ensure the file you've downloaded matches the file maintained in the Hiro Archive.
-
-After downloading an archive file and its associated shasum file, you can verify the integrity of the archive file like so:
-
-```terminal
-$ echo "$(cat | awk '{print $1}') " | shasum --check
-: OK
-
-$ echo "$(cat mainnet-stacks-blockchain-api-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-api-latest.gz" | shasum --check
-
-mainnet-stacks-blockchain-api-latest.gz: OK
-
-# Otherwise a log will be printed indicating failure
-mainnet-stacks-blockchain-api-latest.gz: FAILED
-shasum: WARNING: 1 computed checksum did NOT match
-```
-
-:::callout
-type: warn
-### Note
-If the integrity check fails for any reason, you may need to delete the local archive and re-attempt the download. If issues persist, switch to a different network and try again.
-:::
\ No newline at end of file
diff --git a/hooks/use-breadcrumb.tsx b/hooks/use-breadcrumb.tsx
index 383bc620b..dfc3ba408 100644
--- a/hooks/use-breadcrumb.tsx
+++ b/hooks/use-breadcrumb.tsx
@@ -1,5 +1,7 @@
import { usePathname } from 'next/navigation';
import type { ReactNode } from 'react';
+import { i18n } from '@/lib/i18n';
+import { useTranslations } from './use-translations';
interface BreadcrumbItem {
name: ReactNode;
@@ -7,36 +9,25 @@ interface BreadcrumbItem {
}
/**
- * Format breadcrumb names for display
+ * Format breadcrumb names for display using translations
*/
-function formatBreadcrumbName(name: string): string {
- const specialCases: Record = {
- api: 'API',
- apis: 'APIs',
- cli: 'CLI',
- rpc: 'RPC',
- http: 'HTTP',
- sdk: 'SDK',
- sip: 'SIP',
- bns: 'BNS',
- stx: 'STX',
- nft: 'NFT',
- btc: 'BTC',
- auth: 'Auth',
- };
-
+function formatBreadcrumbName(name: string, translations: any): string {
const lowerName = name.toLowerCase();
- if (specialCases[lowerName]) {
- return specialCases[lowerName];
+
+ // Check if we have a direct translation for this term
+ if (translations.breadcrumb[lowerName]) {
+ return translations.breadcrumb[lowerName];
}
+ // Handle hyphenated names
if (name.includes('-')) {
return name
.split('-')
- .map((word) => formatBreadcrumbName(word))
+ .map((word) => formatBreadcrumbName(word, translations))
.join(' ');
}
+ // Default to capitalizing first letter
return name.charAt(0).toUpperCase() + name.slice(1);
}
@@ -45,8 +36,15 @@ function formatBreadcrumbName(name: string): string {
*/
export function useBreadcrumb(): BreadcrumbItem[] {
const pathname = usePathname();
+ const translations = useTranslations();
const segments = pathname.split('/').filter(Boolean);
+
+ // Remove locale prefix if it exists
+ const firstSegment = segments[0];
+ if (firstSegment && i18n.languages.includes(firstSegment)) {
+ segments.shift();
+ }
const items: BreadcrumbItem[] = [];
let currentPath = '';
@@ -69,7 +67,7 @@ export function useBreadcrumb(): BreadcrumbItem[] {
return;
}
- const name = formatBreadcrumbName(segment);
+ const name = formatBreadcrumbName(segment, translations);
// For the last segment, don't include URL (current page)
if (index === segments.length - 1) {
diff --git a/hooks/use-localized-navigation.tsx b/hooks/use-localized-navigation.tsx
new file mode 100644
index 000000000..fb241d0c2
--- /dev/null
+++ b/hooks/use-localized-navigation.tsx
@@ -0,0 +1,158 @@
+'use client';
+
+import { useMemo } from 'react';
+import type { BaseLayoutProps } from '@/components/layouts/shared';
+import { useTranslations } from './use-translations';
+
+/**
+ * Hook to get localized navigation configuration
+ * Returns navigation items with translations for the current locale
+ */
+export function useLocalizedNavigation(): BaseLayoutProps['links'] {
+ const t = useTranslations();
+
+ return useMemo(
+ () => [
+ // Tools menu
+ {
+ type: 'menu' as const,
+ text: t.navigation.menus.tools,
+ items: [
+ {
+ text: t.tools.clarinet.title,
+ description: t.tools.clarinet.description,
+ url: '/tools/clarinet',
+ },
+ {
+ text: t.tools.chainhook.title,
+ description: t.tools.chainhook.description,
+ url: '/tools/chainhook',
+ },
+ {
+ text: t.tools.contractMonitoring.title,
+ description: t.tools.contractMonitoring.description,
+ url: '/tools/contract-monitoring',
+ },
+ {
+ text: t.tools.clarityVscode.title,
+ description: t.tools.clarityVscode.description,
+ url: '/tools/clarinet/vscode-extension',
+ },
+ {
+ text: t.tools.bitcoinIndexer.title,
+ description: t.tools.bitcoinIndexer.description,
+ url: '/tools/bitcoin-indexer',
+ isNew: true,
+ },
+ ],
+ },
+ // APIs menu
+ {
+ type: 'menu' as const,
+ text: t.navigation.menus.apis,
+ items: [
+ {
+ text: t.apis.apiKeys.title,
+ description: t.apis.apiKeys.description,
+ url: '/resources/guides/api-keys',
+ },
+ {
+ text: t.apis.rateLimits.title,
+ description: t.apis.rateLimits.description,
+ url: '/resources/guides/rate-limits',
+ },
+ {
+ text: t.apis.stacksApi.title,
+ description: t.apis.stacksApi.description,
+ url: '/apis/stacks-blockchain-api',
+ },
+ {
+ text: t.apis.stacksNodeRpcApi.title,
+ description: t.apis.stacksNodeRpcApi.description,
+ url: '/apis/stacks-node-rpc-api',
+ },
+ {
+ text: t.apis.tokenMetadata.title,
+ description: t.apis.tokenMetadata.description,
+ url: '/apis/token-metadata-api',
+ },
+ {
+ text: t.apis.platform.title,
+ description: t.apis.platform.description,
+ url: '/apis/platform-api',
+ },
+ {
+ text: t.apis.ordinals.title,
+ description: t.apis.ordinals.description,
+ url: '/apis/ordinals-api',
+ },
+ {
+ text: t.apis.runes.title,
+ description: t.apis.runes.description,
+ url: '/apis/runes-api',
+ },
+ {
+ text: t.apis.signerMetrics.title,
+ description: t.apis.signerMetrics.description,
+ url: '/apis/signer-metrics-api',
+ },
+ ],
+ },
+ // Libraries & SDKs menu
+ {
+ type: 'menu' as const,
+ text: t.navigation.menus.libraries,
+ items: [
+ {
+ text: t.libraries.stacksJs.title,
+ description: t.libraries.stacksJs.description,
+ url: '/reference/stacks.js',
+ },
+ {
+ text: t.libraries.stacksConnect.title,
+ description: t.libraries.stacksConnect.description,
+ url: '/reference/stacks.js/connect-wallet',
+ },
+ {
+ text: t.libraries.clarinetSdk.title,
+ description: t.libraries.clarinetSdk.description,
+ url: '/tools/clarinet/sdk-introduction',
+ },
+ {
+ text: t.libraries.clarinetBrowserSdk.title,
+ description: t.libraries.clarinetBrowserSdk.description,
+ url: '/tools/clarinet/browser-sdk-reference',
+ },
+ ],
+ },
+ // Resources menu
+ {
+ type: 'menu' as const,
+ text: t.navigation.menus.resources,
+ items: [
+ {
+ text: t.resources.clarityReference.title,
+ description: t.resources.clarityReference.description,
+ url: '/resources/clarity',
+ },
+ {
+ text: t.resources.guides.title,
+ description: t.resources.guides.description,
+ url: '/resources/guides',
+ },
+ {
+ text: t.resources.snippets.title,
+ description: t.resources.snippets.description,
+ url: '/resources/snippets',
+ },
+ {
+ text: t.resources.archive.title,
+ description: t.resources.archive.description,
+ url: '/resources/archive',
+ },
+ ],
+ },
+ ],
+ [t],
+ );
+}
diff --git a/hooks/use-translations.tsx b/hooks/use-translations.tsx
new file mode 100644
index 000000000..78877034b
--- /dev/null
+++ b/hooks/use-translations.tsx
@@ -0,0 +1,34 @@
+'use client';
+
+import { usePathname } from 'next/navigation';
+import { useMemo } from 'react';
+import { i18n } from '@/lib/i18n';
+import { type Translations, translations } from '@/lib/translations';
+
+/**
+ * Hook to get translations for the current locale
+ * Detects locale from the URL path and returns appropriate translations
+ */
+export function useTranslations(): Translations {
+ const pathname = usePathname();
+
+ const currentLocale = useMemo(() => {
+ // Get current language from cookie or detect from path
+ const getCookieLocale = () => {
+ if (typeof document === 'undefined') return null;
+ const match = document.cookie.match(/(?:^|; )locale=([^;]*)/);
+ return match ? match[1] : null;
+ };
+
+ const cookieLocale = getCookieLocale();
+
+ // Check if path has locale prefix
+ const segments = pathname.split('/').filter(Boolean);
+ const pathLocale = i18n.languages.includes(segments[0]) ? segments[0] : null;
+
+ // Use path locale first, then cookie locale, then default
+ return pathLocale || cookieLocale || i18n.defaultLanguage;
+ }, [pathname]);
+
+ return translations[currentLocale] || translations[i18n.defaultLanguage];
+}
diff --git a/idioma.json b/idioma.json
new file mode 100644
index 000000000..d983ff1e0
--- /dev/null
+++ b/idioma.json
@@ -0,0 +1,11 @@
+{
+ "provider": "anthropic",
+ "locale": {
+ "source": "en",
+ "targets": ["es"]
+ },
+ "files": {
+ "include": ["content/docs/[locale]/**/*.{md,mdx}"]
+ },
+ "preserve": ["Clarinet", "Stacks", "Clarity", "/^type:\\s*\\w+$/"]
+}
diff --git a/idioma.lock b/idioma.lock
new file mode 100644
index 000000000..1e2597286
--- /dev/null
+++ b/idioma.lock
@@ -0,0 +1,1330 @@
+version: 1
+files:
+ content/docs/en/start/index.mdx:
+ content: 2b7c1c210ad85ab529ddf2a3231eadb5
+ translations:
+ es: true
+ content/docs/en/tools/contract-monitoring/index.mdx:
+ content: 0246b6000548051a90e626ee9b290d8c
+ translations:
+ es: true
+ content/docs/en/tools/contract-monitoring/create-alert.mdx:
+ content: dbcf487653ba34bb5eaf3acdd3898591
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/index.mdx:
+ content: ece782d79e832d7d80502b0e0ea7df3e
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/index.mdx:
+ content: e0e6fae95b0cde6724695ea676a50993
+ translations:
+ es: true
+ content/docs/en/resources/templates/index.mdx:
+ content: 9098e08cf3996068116244ee0bc1aa4e
+ translations:
+ es: true
+ content/docs/en/resources/guides/using-clarity-values.mdx:
+ content: 728d7eab980615cea1ad448776019166
+ translations:
+ es: true
+ content/docs/en/resources/guides/sync-a-stacks-node.mdx:
+ content: 899c8c24d942d2a5e237863d1877e95a
+ translations:
+ es: true
+ content/docs/en/resources/guides/sync-a-bitcoin-node.mdx:
+ content: 27bfc8c4e74b077ab3368305cb284141
+ translations:
+ es: true
+ content/docs/en/resources/guides/response-headers.mdx:
+ content: 60e48e28b15b144baa33e6a692e855d6
+ translations:
+ es: true
+ content/docs/en/resources/guides/rate-limits.mdx:
+ content: 56708f0c866862d85ca2dd7055ddfd5d
+ translations:
+ es: true
+ content/docs/en/resources/guides/no-loss-lottery.mdx:
+ content: 8a44fa1852f65f7669039146e8590682
+ translations:
+ es: true
+ content/docs/en/resources/guides/installing-docker.mdx:
+ content: 60aa9ede3f98b5c78297695fda3bf7f6
+ translations:
+ es: true
+ content/docs/en/resources/guides/index.mdx:
+ content: cc9153a7eca95fdf92d844b5d6123a5d
+ translations:
+ es: true
+ content/docs/en/resources/guides/build-an-nft-marketplace.mdx:
+ content: ee2de4d1f7d5105959f7320401b3528a
+ translations:
+ es: true
+ content/docs/en/resources/guides/build-a-decentralized-kickstarter.mdx:
+ content: c4a668446367c932d75050d078b70f54
+ translations:
+ es: true
+ content/docs/en/resources/guides/api-keys.mdx:
+ content: fa6bdb5c34bd2f8419f8845fc088ab78
+ translations:
+ es: true
+ content/docs/en/resources/snippets/transfer-stx.mdx:
+ content: 361a5b414b0a83941b4bb46ac462ed37
+ translations:
+ es: true
+ content/docs/en/resources/snippets/transfer-a-sip10-token.mdx:
+ content: 44f4482d4e755166f06f328cc24c176d
+ translations:
+ es: true
+ content/docs/en/resources/snippets/return-an-entry-from-a-map.mdx:
+ content: c42b14ee4e6e6ca628f9533760b242a2
+ translations:
+ es: true
+ content/docs/en/resources/snippets/integrate-api-keys-using-stacksjs.mdx:
+ content: b710dc1b51753fa595e005ac2459aa90
+ translations:
+ es: true
+ content/docs/en/resources/snippets/index.mdx:
+ content: f7f8e5a8e292e3c532b2cb013a253cce
+ translations:
+ es: true
+ content/docs/en/resources/snippets/helper-function-to-restrict-contract-calls.mdx:
+ content: 85e59878c4d6b518e4c6738974173c36
+ translations:
+ es: true
+ content/docs/en/resources/snippets/get-account-details-from-wallet.mdx:
+ content: 8442bdb229a9927b1fc9ecb4f47e12f8
+ translations:
+ es: true
+ content/docs/en/resources/snippets/generate-random-number.mdx:
+ content: 798675b7f6f24e7ce3c977eff911596c
+ translations:
+ es: true
+ content/docs/en/resources/snippets/generate-a-wallet.mdx:
+ content: b2b9ef884fdc9e0e64eac0043cecd08b
+ translations:
+ es: true
+ content/docs/en/resources/snippets/generate-a-secret-key.mdx:
+ content: 671db3a092caeba45414f8cb97e40fcb
+ translations:
+ es: true
+ content/docs/en/resources/snippets/filter-items-from-a-list.mdx:
+ content: 981f03094e936316432056863c19dbbd
+ translations:
+ es: true
+ content/docs/en/resources/snippets/fetch-testnet-bitcoin-on-regtest.mdx:
+ content: a0d66d826d40d2828a8ed2bed19cf0fa
+ translations:
+ es: true
+ content/docs/en/resources/snippets/derive-stacks-address-from-keys.mdx:
+ content: beff47ff834b3aa1ac4265059da2fc7a
+ translations:
+ es: true
+ content/docs/en/resources/snippets/derive-principal-addresses-between-networks.mdx:
+ content: d5cefec5cbde907ab62e77b322a3b6a1
+ translations:
+ es: true
+ content/docs/en/resources/snippets/deploy-a-contract.mdx:
+ content: ed6d5f55ccf7b0de6cbfbc4a2b801b6a
+ translations:
+ es: true
+ content/docs/en/resources/snippets/create-sha256-hash-stacks-js.mdx:
+ content: 122a9fe757785c005724f5c7cd9e269f
+ translations:
+ es: true
+ content/docs/en/resources/snippets/create-sha256-hash-clarity.mdx:
+ content: efb0060e63ca3ccb503532064f453194
+ translations:
+ es: true
+ content/docs/en/resources/snippets/create-a-sponsored-tx.mdx:
+ content: cf2253b094a9c255ad8a860daf3595a5
+ translations:
+ es: true
+ content/docs/en/resources/snippets/create-a-random-burn-address.mdx:
+ content: 5bed2ed84ccec09ff69485b947d87a27
+ translations:
+ es: true
+ content/docs/en/resources/snippets/convert-string-to-principal.mdx:
+ content: 821d82afd38459afd1b2a7f7ffbcdfe5
+ translations:
+ es: true
+ content/docs/en/resources/snippets/convert-btc-to-stx-address.mdx:
+ content: 067fd4f7c6422182a62473f1e02694b0
+ translations:
+ es: true
+ content/docs/en/resources/snippets/check-for-duplicates.mdx:
+ content: 633c920cd53a6a5cb57df0545293cedf
+ translations:
+ es: true
+ content/docs/en/resources/snippets/build-an-unsigned-tx.mdx:
+ content: 47874b25fcc5ddf23be9667497aff9b2
+ translations:
+ es: true
+ content/docs/en/resources/snippets/build-an-nft-pc.mdx:
+ content: bb83105f0f9130e31da483932592bf84
+ translations:
+ es: true
+ content/docs/en/resources/snippets/build-an-ft-pc.mdx:
+ content: 6e3b9f8e57345f21ef1119fabb7301a1
+ translations:
+ es: true
+ content/docs/en/resources/snippets/build-a-stx-pc.mdx:
+ content: e89d98015c15638434a14285d39c96cc
+ translations:
+ es: true
+ content/docs/en/resources/archive/verify-archive-data.mdx:
+ content: 48934f74c2ce1e0a430ab03632271351
+ translations:
+ es: true
+ content/docs/en/resources/archive/token-metadata-api.mdx:
+ content: a4a8d00140c81ac3b1046e1855471118
+ translations:
+ es: true
+ content/docs/en/resources/archive/stacks-blockchain.mdx:
+ content: d9dd578d1489c4708c390006b295b24a
+ translations:
+ es: true
+ content/docs/en/resources/archive/stacks-api.mdx:
+ content: e6d8c822db7123a05d4673d4d560fdce
+ translations:
+ es: true
+ content/docs/en/resources/archive/index.mdx:
+ content: f46be5e103a0df4ede4461698a3250ec
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/index.mdx:
+ content: 5ebdb0edfa5a14d068821c02db259400
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/usage.mdx:
+ content: 5209ebc44256072ab5e07fc347231a59
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/index.mdx:
+ content: 49dd17080e4cd3201278693421200885
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/usage.mdx:
+ content: 623601a62f9bce49833b2d1c6a678709
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/index.mdx:
+ content: f15d5cf047000b04a68c422988fa197d
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/usage.mdx:
+ content: d60f179c32b00a1e84d17863b7dc1c9d
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/index.mdx:
+ content: 999d153b9933f5938bee03326063d974
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/usage.mdx:
+ content: 7314d279220c97a12ead1025bac804ef
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/requesting-proofs.mdx:
+ content: ca609b8a7b67810c08fe221dca57c493
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/pagination.mdx:
+ content: 8354cbd3849866cdeb4f46e6f79f654a
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/nonce-handling.mdx:
+ content: 20d43ddfba91f0899ad03d84725e6408
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/index.mdx:
+ content: 2b4e426187e49060b22f89939ef47bc6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/architecture.mdx:
+ content: 2e6ab783108cb3e0f77795a30699aa52
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/usage.mdx:
+ content: 2706ee2d1a97091c047eb1897c5f65cf
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/index.mdx:
+ content: 28ba965661e8b34b57dac97fd8f422b6
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/usage.mdx:
+ content: fe0970dd04819e1a241b08f1a58d8027
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/index.mdx:
+ content: d830ea9dd59c73a8b80126040f5a7854
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(vscode-extension)/vscode-extension.mdx:
+ content: 60e88643627a68f77ba4b6b3e927629f
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(overview)/faq.mdx:
+ content: d7a21925b98c4cd7c49c28e0673133a9
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(integrations)/stacks-js-integration.mdx:
+ content: 3327e2a2b0d5d02e1d1a2a925caba4b6
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(integrations)/pyth-oracle-integration.mdx:
+ content: 79bd2eaea80b41ec8bf123209c7cc2c8
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(integrations)/chainhook-integration.mdx:
+ content: 4ee1709c48a6a8aa5327c2084d0a20f8
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/unit-testing.mdx:
+ content: 1d9bf04441dd6bf6ee5ace93bd387262
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-reference.mdx:
+ content: c2052be77136ae0919288df50055c1fd
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/mainnet-execution-simulation.mdx:
+ content: a7914ed50f94fdeaf83814ba466c961d
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/integration-testing.mdx:
+ content: 920380cf8e53e66da40ec4ad29736fbb
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/deployment.mdx:
+ content: c95d5a73049024c7b40abdf12dbf48dd
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/clarity-formatter.mdx:
+ content: 11bacf870dcb86c65eb37cd0f7df05bc
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/reference/stacks-scopes.mdx:
+ content: eddcd9f8e69860dc30c3909858c332fa
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/reference/bitcoin-scopes.mdx:
+ content: f0a4f2e9378ce1b9b62bb36a5fcb379a
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(chainhook-cli)/service-mode.mdx:
+ content: b03cca5682cf363ac68e68d8e0695696
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(chainhook-cli)/event-scanning.mdx:
+ content: f7cab8dd10c07d9ff78fe2317022cfec
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(chainhook-cli)/cli-reference.mdx:
+ content: e957e8658bf1aa88f5b4530fc7d078bd
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(overview)/usage.mdx:
+ content: 2509818906e70fda0eab035e2e11a043
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(overview)/quickstart.mdx:
+ content: dde5949e260e47c2aca6188688727354
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(integrations)/register-chainhooks-on-devnet.mdx:
+ content: 4adab0c4cb5a5a24a63171937ea0a999
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(event-handling)/webhook-setup.mdx:
+ content: 256241d98346a7b19b2f518f7b2a55dc
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(event-handling)/payload-handling.mdx:
+ content: 9b02be5964017a7314421ca2b451e39e
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(event-handling)/example-indexers.mdx:
+ content: 0f97f6c4f94ce17f941c7cc4019a5ef2
+ translations:
+ es: true
+ content/docs/en/tools/chainhook/(event-handling)/custom-indexer.mdx:
+ content: a39c099d151c014bcfb76834870c98a5
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(indexer)/node-installation.mdx:
+ content: 94fae442ea20991dfeac5649dc4e2ce1
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(indexer)/installation.mdx:
+ content: 8a39c91de862d7a5efed88f4e5d5a876
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(indexer)/full-sync.mdx:
+ content: f783285d58eeca56467ace17753c2a69
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(indexer)/configuration.mdx:
+ content: 41784cdfcfb764a763ca5e6c08f17eb9
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(indexer)/archive-bootstrap.mdx:
+ content: 12eaf0811027fc98a2ea5f39eaf0651c
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(integrations)/runes-api.mdx:
+ content: 326ce76f4db69ab02c71b48dae0e02f5
+ translations:
+ es: true
+ content/docs/en/tools/bitcoin-indexer/(integrations)/ordinals-api.mdx:
+ content: 44c9029c1427ac773ed48752a144c2fa
+ translations:
+ es: true
+ content/docs/en/resources/clarity/reference/types.mdx:
+ content: 0a92f483db02bdc001dd30ad3c03dce1
+ translations:
+ es: true
+ content/docs/en/resources/clarity/reference/keywords.mdx:
+ content: 9246ef989f8327661035182341737d67
+ translations:
+ es: true
+ content/docs/en/resources/clarity/reference/functions.mdx:
+ content: 6ca196c9c8edd71082e4fdef8402f315
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/packages/transactions.mdx:
+ content: 68a54c48f2e21e78c1b1ec10a6ea739d
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/packages/sbtc.mdx:
+ content: af8551c14bcea9a38e020dc659f52efb
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/packages/network.mdx:
+ content: 43de02c2d3d5df8197dbe4bf98749b6a
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/packages/connect.mdx:
+ content: 704d3d4ac4250ba25e5c218542352350
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(utils)/unit-conversion.mdx:
+ content: 8ad9e29912d38bd42a4b536b5883cb9e
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(utils)/network-configuration.mdx:
+ content: e51d3aafe75588409cb45685faf3b8a9
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(utils)/encoding-decoding.mdx:
+ content: 9e1baede187aed6f7bec076f7d178a49
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(utils)/address-validation.mdx:
+ content: 002424d4b7ae82370fc50f03a3afd465
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(post-conditions)/post-conditions.mdx:
+ content: 97272e4387bce7fc8a4af37e7d5205b1
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(post-conditions)/implementing-post-conditions.mdx:
+ content: bf19b0e9a533de26276abc259fca15df
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(overview)/private-keys.mdx:
+ content: b9e19b21d5e878e63322326f71406048
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(overview)/networks.mdx:
+ content: cd0c48633b43edb7850d36d76f09d3e1
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(overview)/accounts-and-addresses.mdx:
+ content: 7452171612635a10a3cbcffc4622179b
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(integrations)/react-native-integration.mdx:
+ content: 6dbf10d4c0dc485718dd8960d7b49f6a
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(local-accounts)/read-only-calls.mdx:
+ content: 2c4c6426d1d09ef64bc3d42d817c4642
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(local-accounts)/contract-deployment.mdx:
+ content: 6c555c226894e06a0b304d72839a04cc
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(local-accounts)/contract-calls.mdx:
+ content: b518223183ba1e40e8c6e0f65b3a9911
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(local-accounts)/build-transactions.mdx:
+ content: 7621e60d6fadcd6bbce47d08da3f8850
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(connect)/wallet-support.mdx:
+ content: d80522ef6070b0e37aa0cc78472f19c0
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(connect)/migration-guide.mdx:
+ content: cb8407ae5076affcc7a3bc96185dcce6
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(connect)/message-signing.mdx:
+ content: 4456cfe1bbd61a527f19c2f1116ba3ce
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(connect)/connect-wallet.mdx:
+ content: 4496d42db1f322808ca35fbdf1ae1234
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(connect)/broadcast-transactions.mdx:
+ content: 6d911c6d1cfa38724508763388ffe98e
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/tokens/semi-fungible-token-metadata.mdx:
+ content: f536f8ea39834e54b08a36ae3a247b25
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/tokens/non-fungible-token-metadata.mdx:
+ content: 3fea24267a0f0f7e260cfd50941f4eb0
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/tokens/index.mdx:
+ content: d4be7129ad4b757b3da80d5b6b703d01
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/tokens/fungible-tokens.mdx:
+ content: 95a1599e69f307d9abd16df30ca66447
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/tokens/fungible-token-metadata.mdx:
+ content: 951b0ed31d388d6d1913e3687bb7768b
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/info/status.mdx:
+ content: 5c2d1a75bddf1355c17b77629d19ba54
+ translations:
+ es: true
+ content/docs/en/apis/token-metadata-api/reference/info/index.mdx:
+ content: 64c27694973a3a5eafdc1ccf6affdda5
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signers.mdx:
+ content: 2783ed73bcbff3a15f4f63d5435efba9
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/signers/pox-cycle-signer.mdx:
+ content: 5e07dad456baf29d6cada6b43a77c9e3
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/info/status.mdx:
+ content: b6d14ab92130e71b3ca14ebcc24572ac
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-most-recent-blocks.mdx:
+ content: eaf84fb6329d1a51ea2138abff91f1c5
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/blocks/aggregated-signer-information-for-a-block.mdx:
+ content: 9424aa9cdcfc7d430d8a1a1856bbf988
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-most-recent-block-proposals.mdx:
+ content: 35118e051f4abc7932652145627db269
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/block-proposals/signer-information-for-a-block.mdx:
+ content: 21bab35a8e5f48357db4416c66c88e47
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/etchings/index.mdx:
+ content: f7c0dea0e296192a87902a9b4b0e70c3
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/etchings/get-etchings.mdx:
+ content: cc5b2c72378048b91912f8cb454e7660
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/etchings/get-etching.mdx:
+ content: 383f63c73b5b8440520523cf45e9add8
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/info/status.mdx:
+ content: 86a8b0b52b5e96f0a01d008c20656e37
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/info/index.mdx:
+ content: 3ccd6bf911a0139df28f8ace120959fb
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/balances/index.mdx:
+ content: 02eff4e04928ce9c95d9a1365e25e4b8
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/balances/holders.mdx:
+ content: 8a79729fda470506d0c83651a05d12ef
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/balances/holder-balance.mdx:
+ content: 9374563366d1c530bf9861c7c043ef5d
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/balances/address.mdx:
+ content: 3db8ed7e93ec1d7d5e218331164564fb
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/activities/index.mdx:
+ content: 3b1d2c9da708d0594713774baaa9d0c4
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/activities/for-transaction.mdx:
+ content: 4fd0382474e6fad159a314ca0a9efc78
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/activities/for-block.mdx:
+ content: ea2928380b61eb0b6bf60138d6c36c54
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/activities/for-address.mdx:
+ content: d3c1c25908afcaaf4b88cf5a56820260
+ translations:
+ es: true
+ content/docs/en/apis/runes-api/reference/activities/activity.mdx:
+ content: fe9c4d93dfcee8168373beb66cb5ca0e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-for-address.mdx:
+ content: 688420fc1a602c3a56521284257d1996
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/transactions-by-block.mdx:
+ content: e9157bea090f32d9c589adebb8f7c6d4
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/transaction-events.mdx:
+ content: e6085c508731dce28fa4dfed31921210
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/transaction-details-v3.mdx:
+ content: df758397076f2ba6747cfbe05815ee7c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/statistics-for-mempool-transactions.mdx:
+ content: 06052f9648c994926e05571f8fa39c75
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/recent-transactions.mdx:
+ content: 654518441ab083b556a0aabce6c5dd34
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/mempool-transactions.mdx:
+ content: 6decb81779e55f169bbad214c23b7c8d
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-transaction.mdx:
+ content: 325db9a5d13e589e19871dc0b69756e5
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/get-raw-transaction.mdx:
+ content: 538f162640b40dc8c42829fc49ade397
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/events-for-an-address-transaction.mdx:
+ content: 8f4d605ad7fca8394d19d7f3437b2ad7
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/details-for-transactions.mdx:
+ content: 6ba7040e6a4faf2ce3a146b759d5daf0
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/broadcast-transaction.mdx:
+ content: 10c639b35cd09025e2ef50c46af4324b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/transactions/address-transactions.mdx:
+ content: 4c08862319e829912d2f4b6c0fe56607
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/total-burnchain-rewards-for-recipient.mdx:
+ content: 3565fe9bd211c0b368763a82f3680253
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holders.mdx:
+ content: 84f50d4966368081d563162e449858d2
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-reward-slot-holder-entries.mdx:
+ content: e715531646f247d1b2f315cac5b2db33
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipients.mdx:
+ content: 9df1251d6462a65665edbe5b2de88a7b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-rewards/recent-burnchain-reward-recipient.mdx:
+ content: 01cb91cfa03589850a0d4b076a6c098d
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/tokens/holders.mdx:
+ content: 1dd49852339f173ceb15b88ebf3f3880
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/stacking-pool/members.mdx:
+ content: 6644fbae8241a3899024a589bdfdb2df
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/variable.mdx:
+ content: 18d0da8aaa08b9f87780c7e54331eb81
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/traits.mdx:
+ content: 0d3817665831f86a1f6e2b3652b50b82
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/status.mdx:
+ content: ebd631caf8d23c9a93a1c761dbe96c26
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/source.mdx:
+ content: 1f7ba4f35398ce0abb508fbb80c87b43
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/read-only.mdx:
+ content: 72171b7feb16a44e2bfcb7eaa80a2851
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/map-entry.mdx:
+ content: 76c81e4292f156b1b467e57660e0aff5
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/interface.mdx:
+ content: 2d3e0b2d47d0b79b1aef4d8674889e21
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/info.mdx:
+ content: 988db66373aaef26e37bffe6617ab0c1
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/fast-read-only.mdx:
+ content: 81dcd644152de39ec46ca40443503590
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/events.mdx:
+ content: bcfa807b09897979f7587d4b1d36ef98
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/constants.mdx:
+ content: 12dc74615cd8bc374087c87590656de6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/sortitions/sortition-by-consensus-hash.mdx:
+ content: 4c58306ab9563a1e0dd8b2c26a017d6c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-height.mdx:
+ content: 6d51fdef4f10eb25fddcd8ad341bb902
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/sortitions/sortition-by-burn-hash.mdx:
+ content: 01a5569758a40ef51aff6ffe39f1b244
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/sortitions/latest-and-last-sortitions.mdx:
+ content: c114821266c5f76c79213486a507978e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/sortitions/get-sortitions.mdx:
+ content: 2c0fb8f6ef8cd9b5731dc3d459a80ad3
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/search/search-by-id.mdx:
+ content: d8209276ed0628bf0ea359176a36f59e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/stackers-for-signer-in-cycle.mdx:
+ content: 15752627b0ee89c45d5bd6273668a06c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/stacker-set.mdx:
+ content: 6ddccf4db59f08eb47873e138f4f505e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signers-in-cycle.mdx:
+ content: 697cfd8770791794fb04940e042ac41d
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-in-cycle.mdx:
+ content: b3e570481b6f4c43b567cf0257c155a3
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/signer-details.mdx:
+ content: c94716999f3718f9585580778ad483aa
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/pox-details.mdx:
+ content: 987ec5eac45afa468eed847c10f0fab8
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycles.mdx:
+ content: 3d7a4e9d3e41940d9edc4d178183e57f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/proof-of-transfer/cycle.mdx:
+ content: 06dc56782a65bac79c6ef370bb100319
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/mints.mdx:
+ content: c17dfe3e37ae90c5d868deee7f25557d
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/holdings.mdx:
+ content: 3dd34e04d3ac6a2771f5ef9a671c65f6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/non-fungible-tokens/history.mdx:
+ content: c0b4bc306460e3aa81b9c4346d3fa96f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/owned-by-address.mdx:
+ content: 997cba378191c195156dc0cbc60a180f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/namespaces.mdx:
+ content: 21e5df72751bdfe55c3121cb141969e6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/namespace-names.mdx:
+ content: 022658613b8aa7ad697f7c1ac81ddb2f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/names.mdx:
+ content: 0d49eecaeead50f9649c843d08165468
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/name-zonefile.mdx:
+ content: 0d35e5c0f4e597708f7c045b116f3d36
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/name-subdomains.mdx:
+ content: 7e13b66cfdae4ec45e61ff1225718b7c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/name-details.mdx:
+ content: 0972472bb58f226c72407f26125e4c53
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/names/historical-zonefile.mdx:
+ content: 4abac5ee77c1d27f49b2fb4797226c2a
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/mempool/transaction-fee-priorities.mdx:
+ content: a5a3dbbd96d8a3d9762d37f96b197126
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/nakamoto/tenure-tip.mdx:
+ content: 4f09d0bd1d4d308724f28526ee219f0f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/nakamoto/tenure-metadata.mdx:
+ content: 5d991417a21127be7b0b9c57b742becc
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/nakamoto/tenure-fork-info.mdx:
+ content: e2dafffb5fb59faa2ce34505ebb185ce
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/nakamoto/tenure-blocks.mdx:
+ content: 73378091f50700943b85245a786504ab
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/nakamoto/nakamoto-block.mdx:
+ content: dceb23bf61c28525cfffe1c09a23f95f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/total-stx-supply-in-plain-text.mdx:
+ content: 3519f044187246dc3b4ecd3c4926fbcd
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/total-and-unlocked-stx-supply.mdx:
+ content: f14f1fd690b3e255bff2dbee4e4e972d
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/status.mdx:
+ content: 1e279f99bd13ddefc342736e418d8f8b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/network-given-block-time.mdx:
+ content: bd6aa30acb6dd1fc6fcc53d84bb6fcee
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/network-block-time.mdx:
+ content: 87a3ee4daf854a2a2116a3a96ef38dd2
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/legacy-total-and-unlocked-stx-supply.mdx:
+ content: 0eecc89c39184e314a4cb408e316e292
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/health.mdx:
+ content: 35f5cff4a74963542b6bc73cfc18f419
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/core-api.mdx:
+ content: 17191268b78009969ad9a9493bac845b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/info/circulating-stx-supply-in-plain-text.mdx:
+ content: 6673affb10536018fa5ffbe6c30a6d22
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/fees/transfer-estimate.mdx:
+ content: 2421d9f84323c43d54401dc87d38cc96
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/fees/fee-rate.mdx:
+ content: 2a6d55d87f29c37eaca490b0842b198a
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/fees/estimate.mdx:
+ content: d21c58402ba06e2c847abaa68ffb5c05
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/faucets/stx.mdx:
+ content: e501ec8d2313eaf6272833ca19980daf
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-blocks.mdx:
+ content: 7d958c2b59492efa6cfe75cec5303739
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/burn-blocks/get-burn-block.mdx:
+ content: 495f7c95ae79130e15b443f5f5d7b5a6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/upload-block.mdx:
+ content: 903b9c51d883a8063f9c5cdb210998d9
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/recent-blocks.mdx:
+ content: c740f4e426e0876953e060597ebdbdc0
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks.mdx:
+ content: c517e940152af994026a46598e6f7939
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-blocks-by-burn-block.mdx:
+ content: 74dfd2a0f825f79ae1619ba3d56f5e39
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/get-block.mdx:
+ content: c2c0dfedc1d3674e13a96901a4025fdf
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-proposal.mdx:
+ content: 5c1485071eced78b411ab9765a5bf930
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-height.mdx:
+ content: 6a4418a4bbdf0e9f51841916d052d8ab
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-height-v3.mdx:
+ content: 0e9ec8ec86f3db97032eb23726c7cfc9
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-hash.mdx:
+ content: ca3fe08cb68ff62817110d6eda813b94
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-height.mdx:
+ content: f8de708c789855a8cc80498544ff9dc1
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/block-by-burn-block-hash.mdx:
+ content: 40d03dd6644fcddf144e75f1561001e3
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/blocks/average-times.mdx:
+ content: 64a3ccbe79fe96c2284dfad5901d0145
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions.mdx:
+ content: 0e432ba0c0ee1f54d6267faf415729ca
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/transactions-with-transfers.mdx:
+ content: 839846d13db36f0b95a119124a584466
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/transaction-with-transfers.mdx:
+ content: 6c3550e9cb04ed73c679f9d92a4199e6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/stx-balances.mdx:
+ content: 29f12cec2b30937164e8ca2598e1e5cc
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/latest-nonce.mdx:
+ content: 96426e06cc9b8540c19ab982aeb34c9c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/info.mdx:
+ content: 3bffb4fa78c8fa540d8873500356e7a7
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/inbound-stx-transfers.mdx:
+ content: 9066a19d3da397cc492ac5c80e5ecfd7
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/balances.mdx:
+ content: 72b57e759c2d9a924c66df1afa5febee
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/accounts/assets.mdx:
+ content: 0c9c7975413a69b59cf57bd9d876a6ac
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/statistics/index.mdx:
+ content: 1103ade7566b10d425d48ddde90acc74
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/statistics/get-stats-inscription-count.mdx:
+ content: 4230f913584c0dac8ea604588407ccce
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/update.mdx:
+ content: a03a36cea5f1c11f502ebc40f65ea6b0
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/status.mdx:
+ content: 5b544ee7d77581dcb7aa439d8ad863be
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/list.mdx:
+ content: 943bd15fbc8083a902d41b9cd107a039
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/index.mdx:
+ content: 2e4f3e8db8273c69b2adcb31a4c36245
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/get.mdx:
+ content: 856b22bbfcebaf8cd7cfd44f9bca8d5b
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/delete.mdx:
+ content: d68ec1cf4738a2f11d56d3ed4610a58c
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/chainhooks/create.mdx:
+ content: 5d02d62621983edc752a40b685591e70
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/devnet/stop.mdx:
+ content: 54c8879aa39a9c60298110890bb08437
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/devnet/start.mdx:
+ content: 23f0ddd5d301d80d0d93c68886f603b2
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/devnet/stacks-blockchain-api.mdx:
+ content: 76ca5ad69f152a0eb87452e21d7e33b1
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/devnet/index.mdx:
+ content: 9d346967a7508eeba5cf0a80a85548a0
+ translations:
+ es: true
+ content/docs/en/apis/platform-api/reference/devnet/bitcoin-node.mdx:
+ content: dbc8945485b73c52c8632638872a64a9
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/satoshis/index.mdx:
+ content: 64e7b31877de8b4626037e8598c1c41e
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi.mdx:
+ content: 144defd84997109d355e253a34adc439
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/satoshis/get-satoshi-inscriptions.mdx:
+ content: 23ae44a6f2c05b3cf8156ad1da154977
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/index.mdx:
+ content: 52c798db8d51cbd0ddc6bd171f193b3a
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/get-transfers-per-block.mdx:
+ content: 620311a4d63095d25c834e9f3f89116d
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscriptions.mdx:
+ content: 653c9d1b7d97b35fc21e33b957cad7e3
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription.mdx:
+ content: 40e8fc12209a7d9aca560d8576787212
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-transfers.mdx:
+ content: c51713f4a01d4abe5a90c4962fb3c7f3
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/inscriptions/get-inscription-content.mdx:
+ content: dd18929375cc13c022cb46a4f17efcf2
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/info/status.mdx:
+ content: 529dcc80c0804b9206281f371032262f
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/info/index.mdx:
+ content: 6456155efe6412224483267c7b575002
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/index.mdx:
+ content: 59cef082f99dd038a520c395f49de879
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-tokens.mdx:
+ content: e9c46e9c0e10e0e85069c097d052bd9d
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-holders.mdx:
+ content: e538761d5f130823e406bf2a88276c39
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-token-details.mdx:
+ content: a0376c3895970c67f371f38ef689cee6
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-balances.mdx:
+ content: f304f3e2ed9daf67fafc9fdcb58d206d
+ translations:
+ es: true
+ content/docs/en/apis/ordinals-api/reference/brc20/get-brc20-activity.mdx:
+ content: 5bd7e58ef946365e0c7c8b3f24fcaa64
+ translations:
+ es: true
+ content/docs/en/apis/stacks-blockchain-api/reference/smart-contracts/by-trait.mdx:
+ content: 7e156caf442e90e1d078462fff25a13e
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/info/index.mdx:
+ content: 1053e8904a8982bc377ab524fdacdf67
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/signers/index.mdx:
+ content: f0c47f15b9a66e8fb077b27c346a8be4
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/blocks/index.mdx:
+ content: 26186679c6e60aa68cd71898ea9453fe
+ translations:
+ es: true
+ content/docs/en/apis/signer-metrics-api/reference/block-proposals/index.mdx:
+ content: ed851f2b26e1d21f66c5d90f68a44dc4
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/index.mdx:
+ content: f1201d960004afac50683cd6ce85a5ab
+ translations:
+ es: true
+ content/docs/en/resources/clarity/index.mdx:
+ content: b54770928c81739a6652df6edd4c9ac3
+ translations:
+ es: true
+ content/docs/en/resources/guides/using-pyth-price-feeds.mdx:
+ content: b6fedf15336c0fa9bafa73b73ef944c1
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(overview)/quickstart.mdx:
+ content: f93805a60c5bdc6d344156ca17b6aa00
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(overview)/project-structure.mdx:
+ content: 19be410d3b0e4208fa1e78f21d344c7f
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(integrations)/sbtc-integration.mdx:
+ content: 1e885474ba73a97650453f81a3bac245
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/validation-and-analysis.mdx:
+ content: 1c00e91c13b28c9e743502b6253ea04d
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/project-development.mdx:
+ content: d6f3787abe4dcec5d9bac4402a2e1a26
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/local-blockchain-development.mdx:
+ content: 8aeb63d215fccc1a92b4bd16e2d76bc2
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/contract-interaction.mdx:
+ content: b8918a23bcf9595544d9353dc057c895
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-cli)/cli-reference.mdx:
+ content: 1804c7cefe8c3b7bd8a132ccfca20e9a
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/sdk-introduction.mdx:
+ content: 3b022c232810e4d8528b206d7cb01523
+ translations:
+ es: true
+ content/docs/en/tools/clarinet/(clarinet-js-sdk)/browser-sdk-reference.mdx:
+ content: 66b9da7aaf786a8864961ea4dc9b5051
+ translations:
+ es: true
+ content/docs/en/reference/stacks.js/(integrations)/pyth-oracle-integration.mdx:
+ content: a0bb8207e6e36a371a5edc3e309b656d
+ translations:
+ es: true
+ content/docs/en/resources/clarity/(integrations)/external-data.mdx:
+ content: 0d493d144eea52bd65f81ca15c340a30
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/usage.mdx:
+ content: 1243593b9df0e200acab53ff82cdf513
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/index.mdx:
+ content: 71b1b7af03c741b61afcab1e77ee9a4c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/transactions/transaction-details-v3.mdx:
+ content: df758397076f2ba6747cfbe05815ee7c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/transactions/broadcast-transaction.mdx:
+ content: 10c639b35cd09025e2ef50c46af4324b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-consensus-hash.mdx:
+ content: 4c58306ab9563a1e0dd8b2c26a017d6c
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-height.mdx:
+ content: 6d51fdef4f10eb25fddcd8ad341bb902
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/sortition-by-burn-hash.mdx:
+ content: 01a5569758a40ef51aff6ffe39f1b244
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/latest-and-last-sortitions.mdx:
+ content: c114821266c5f76c79213486a507978e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/sortitions/get-sortitions.mdx:
+ content: 2c0fb8f6ef8cd9b5731dc3d459a80ad3
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/variable.mdx:
+ content: 18d0da8aaa08b9f87780c7e54331eb81
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/traits.mdx:
+ content: 0d3817665831f86a1f6e2b3652b50b82
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/source.mdx:
+ content: 1f7ba4f35398ce0abb508fbb80c87b43
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/read-only.mdx:
+ content: 72171b7feb16a44e2bfcb7eaa80a2851
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/map-entry.mdx:
+ content: 76c81e4292f156b1b467e57660e0aff5
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/interface.mdx:
+ content: 2d3e0b2d47d0b79b1aef4d8674889e21
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/fast-read-only.mdx:
+ content: 81dcd644152de39ec46ca40443503590
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/smart-contracts/constants.mdx:
+ content: 12dc74615cd8bc374087c87590656de6
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/stacker-set.mdx:
+ content: 6ddccf4db59f08eb47873e138f4f505e
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/signer-details.mdx:
+ content: c94716999f3718f9585580778ad483aa
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/proof-of-transfer/pox-details.mdx:
+ content: 987ec5eac45afa468eed847c10f0fab8
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/info/health.mdx:
+ content: 35f5cff4a74963542b6bc73cfc18f419
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/info/core-api.mdx:
+ content: 17191268b78009969ad9a9493bac845b
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/fees/transfer-estimate.mdx:
+ content: 2421d9f84323c43d54401dc87d38cc96
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/fees/estimate.mdx:
+ content: d21c58402ba06e2c847abaa68ffb5c05
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/blocks/upload-block.mdx:
+ content: 903b9c51d883a8063f9c5cdb210998d9
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-proposal.mdx:
+ content: 5c1485071eced78b411ab9765a5bf930
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/blocks/block-by-height-v3.mdx:
+ content: 0e9ec8ec86f3db97032eb23726c7cfc9
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-tip.mdx:
+ content: 4f09d0bd1d4d308724f28526ee219f0f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-metadata.mdx:
+ content: 5d991417a21127be7b0b9c57b742becc
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-fork-info.mdx:
+ content: e2dafffb5fb59faa2ce34505ebb185ce
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/tenure-blocks.mdx:
+ content: 73378091f50700943b85245a786504ab
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/nakamoto/nakamoto-block.mdx:
+ content: dceb23bf61c28525cfffe1c09a23f95f
+ translations:
+ es: true
+ content/docs/en/apis/stacks-node-rpc-api/reference/accounts/info.mdx:
+ content: 3bffb4fa78c8fa540d8873500356e7a7
+ translations:
+ es: true
+ content/docs/en/resources/archive/download-guide.mdx:
+ content: 25c13ed29bef0e98811ac88d7935689b
+ translations:
+ es: true
diff --git a/lib/i18n.ts b/lib/i18n.ts
new file mode 100644
index 000000000..374a83e8d
--- /dev/null
+++ b/lib/i18n.ts
@@ -0,0 +1,34 @@
+import type { I18nConfig } from 'fumadocs-core/i18n';
+
+export const i18n: I18nConfig = {
+ defaultLanguage: 'en',
+ languages: ['en', 'es'],
+ // hideLocale: 'default-locale',
+};
+
+export const languageNames: Record = {
+ en: 'English',
+ es: 'Español',
+};
+
+export const languageAbbreviations: Record = {
+ en: 'EN',
+ es: 'ES',
+};
+
+export const languageFlags: Record = {
+ en: '🇺🇸',
+ es: '🇪🇸',
+};
+
+// Localized language names - key is the language code, value is how to say that language name in different locales
+export const localizedLanguageNames: Record> = {
+ en: {
+ en: 'English',
+ es: 'Inglés',
+ },
+ es: {
+ en: 'Spanish',
+ es: 'Español',
+ },
+};
diff --git a/lib/locale-utils.ts b/lib/locale-utils.ts
new file mode 100644
index 000000000..659640e36
--- /dev/null
+++ b/lib/locale-utils.ts
@@ -0,0 +1,44 @@
+import { i18n } from '@/lib/i18n';
+
+/**
+ * Extract locale from a URL path
+ * @param pathname - The URL pathname to parse
+ * @returns The detected locale or default locale
+ */
+export function getLocaleFromPath(pathname: string): string {
+ // Check if path has locale prefix
+ const segments = pathname.split('/').filter(Boolean);
+ const pathLocale = i18n.languages.includes(segments[0]) ? segments[0] : null;
+
+ return pathLocale || i18n.defaultLanguage;
+}
+
+/**
+ * Extract locale from request headers (referer)
+ * Used in API routes where we can't use React hooks
+ * @param request - The incoming request
+ * @returns The detected locale or default locale
+ */
+export function getLocaleFromRequest(request: Request): string {
+ // Try to get locale from referer header
+ const referer = request.headers.get('referer');
+ if (referer) {
+ try {
+ const refererUrl = new URL(referer);
+ return getLocaleFromPath(refererUrl.pathname);
+ } catch {
+ // Invalid referer URL, fall back to default
+ }
+ }
+
+ // Could also check Accept-Language header as fallback
+ const acceptLanguage = request.headers.get('accept-language');
+ if (acceptLanguage) {
+ const preferredLang = acceptLanguage.split(',')[0]?.split('-')[0];
+ if (preferredLang && i18n.languages.includes(preferredLang)) {
+ return preferredLang;
+ }
+ }
+
+ return i18n.defaultLanguage;
+}
diff --git a/lib/remark-custom-directives.ts b/lib/remark-custom-directives.ts
index 47403a5e2..1d9f24c14 100644
--- a/lib/remark-custom-directives.ts
+++ b/lib/remark-custom-directives.ts
@@ -81,47 +81,38 @@ function transformNextStepsDirective(node: any, index: number | undefined, paren
return;
}
- // Create the transformed nodes
- const transformedNodes = [
- // ## Next steps header
- {
- type: 'heading',
- depth: 2,
- children: [{ type: 'text', value: 'Next steps' }],
- },
- // wrapper with children
- {
+ // Create the transformed node - just the wrapper with children
+ const transformedNode = {
+ type: 'mdxJsxFlowElement',
+ name: 'Cards',
+ attributes: [],
+ children: nextStepsData.map((step) => ({
type: 'mdxJsxFlowElement',
- name: 'Cards',
- attributes: [],
- children: nextStepsData.map((step) => ({
- type: 'mdxJsxFlowElement',
- name: 'NextCard',
- attributes: [
- {
- type: 'mdxJsxAttribute',
- name: 'href',
- value: step.href,
- },
- {
- type: 'mdxJsxAttribute',
- name: 'title',
- value: step.title,
- },
- {
- type: 'mdxJsxAttribute',
- name: 'description',
- value: step.description,
- },
- ],
- children: [],
- })),
- },
- ];
-
- // Replace the directive node with our transformed nodes
+ name: 'NextCard',
+ attributes: [
+ {
+ type: 'mdxJsxAttribute',
+ name: 'href',
+ value: step.href,
+ },
+ {
+ type: 'mdxJsxAttribute',
+ name: 'title',
+ value: step.title,
+ },
+ {
+ type: 'mdxJsxAttribute',
+ name: 'description',
+ value: step.description,
+ },
+ ],
+ children: [],
+ })),
+ };
+
+ // Replace the directive node with our transformed node
if (parent && index !== null) {
- parent.children.splice(index, 1, ...transformedNodes);
+ parent.children.splice(index, 1, transformedNode);
}
}
@@ -315,64 +306,55 @@ function transformObjectivesDirective(
}
}
- // Create transformed nodes
- const transformedNodes = [
- // ## What you'll learn
- {
- type: 'heading',
- depth: 2,
- children: [{ type: 'text', value: "What you'll learn" }],
- },
- // Container div with objectives
- {
+ // Create transformed node - just the container div with objectives
+ const transformedNode = {
+ type: 'mdxJsxFlowElement',
+ name: 'div',
+ attributes: [
+ {
+ type: 'mdxJsxAttribute',
+ name: 'className',
+ value: 'space-y-3 my-6',
+ },
+ ],
+ children: objectives.map((text) => ({
type: 'mdxJsxFlowElement',
name: 'div',
attributes: [
{
type: 'mdxJsxAttribute',
name: 'className',
- value: 'space-y-3 my-6',
+ value: 'flex items-start gap-3',
+ },
+ ],
+ children: [
+ // ArrowRight icon
+ {
+ type: 'mdxJsxFlowElement',
+ name: 'ArrowRight',
+ attributes: [
+ {
+ type: 'mdxJsxAttribute',
+ name: 'className',
+ value: 'h-4 w-4 text-brand-orange dark:text-brand-orange mt-1.5 flex-shrink-0',
+ },
+ ],
+ children: [],
+ },
+ // Text span
+ {
+ type: 'mdxJsxFlowElement',
+ name: 'span',
+ attributes: [],
+ children: [{ type: 'text', value: text }],
},
],
- children: objectives.map((text) => ({
- type: 'mdxJsxFlowElement',
- name: 'div',
- attributes: [
- {
- type: 'mdxJsxAttribute',
- name: 'className',
- value: 'flex items-start gap-3',
- },
- ],
- children: [
- // ArrowRight icon
- {
- type: 'mdxJsxFlowElement',
- name: 'ArrowRight',
- attributes: [
- {
- type: 'mdxJsxAttribute',
- name: 'className',
- value: 'h-4 w-4 text-brand-orange dark:text-brand-orange mt-1.5 flex-shrink-0',
- },
- ],
- children: [],
- },
- // Text span
- {
- type: 'mdxJsxFlowElement',
- name: 'span',
- attributes: [],
- children: [{ type: 'text', value: text }],
- },
- ],
- })),
- },
- ];
-
- // Replace directive with transformed nodes
+ })),
+ };
+
+ // Replace directive with transformed node
if (parent && index !== undefined) {
- parent.children.splice(index, 1, ...transformedNodes);
+ parent.children.splice(index, 1, transformedNode);
}
}
@@ -408,32 +390,23 @@ function transformPrerequisitesDirective(
file.warn('prerequisites directive should contain at most 6 items', node.position);
}
- // Create transformed nodes
- const transformedNodes = [
- // ## Prerequisites
- {
- type: 'heading',
- depth: 2,
- children: [{ type: 'text', value: 'Prerequisites' }],
- },
- // Container div with the original list inside
- {
- type: 'mdxJsxFlowElement',
- name: 'div',
- attributes: [
- {
- type: 'mdxJsxAttribute',
- name: 'className',
- value: 'my-6',
- },
- ],
- children: node.children, // Keep all original children including the list
- },
- ];
+ // Create transformed node - just the container div with the original list inside
+ const transformedNode = {
+ type: 'mdxJsxFlowElement',
+ name: 'div',
+ attributes: [
+ {
+ type: 'mdxJsxAttribute',
+ name: 'className',
+ value: 'my-6',
+ },
+ ],
+ children: node.children, // Keep all original children including the list
+ };
- // Replace directive with transformed nodes
+ // Replace directive with transformed node
if (parent && index !== undefined) {
- parent.children.splice(index, 1, ...transformedNodes);
+ parent.children.splice(index, 1, transformedNode);
}
}
diff --git a/lib/translations/en.ts b/lib/translations/en.ts
new file mode 100644
index 000000000..18ebe5ab2
--- /dev/null
+++ b/lib/translations/en.ts
@@ -0,0 +1,161 @@
+import type { Translations } from './types';
+
+export const en: Translations = {
+ navigation: {
+ signIn: 'Sign in',
+ menus: {
+ tools: 'Tools',
+ apis: 'APIs',
+ libraries: 'Libraries & SDKs',
+ resources: 'Resources',
+ },
+ search: 'Search',
+ searchAriaLabel: 'Search',
+ llmShare: {
+ copyMarkdown: 'Copy markdown',
+ viewAsMarkdown: 'View as Markdown',
+ openIn: 'Open in',
+ askQuestions: 'Ask questions about this page',
+ },
+ toc: {
+ contents: 'Contents',
+ },
+ feedback: {
+ question: 'How is this guide?',
+ good: 'Good',
+ bad: 'Bad',
+ thankYou: 'Thank you for your feedback!',
+ viewHere: 'View here',
+ placeholder: 'Leave your feedback...',
+ submit: 'Submit',
+ submitting: 'Submitting...',
+ },
+ },
+ breadcrumb: {
+ // Main sections
+ tools: 'Tools',
+ apis: 'APIs',
+ reference: 'Reference',
+ resources: 'Resources',
+
+ // Common terms
+ api: 'API',
+ cli: 'CLI',
+ rpc: 'RPC',
+ http: 'HTTP',
+ sdk: 'SDK',
+ sip: 'SIP',
+ bns: 'BNS',
+ stx: 'STX',
+ nft: 'NFT',
+ btc: 'BTC',
+ auth: 'Auth',
+
+ // Tools
+ clarinet: 'Clarinet',
+ chainhook: 'Chainhook',
+
+ // Specific pages/sections
+ guides: 'Guides',
+ clarity: 'Clarity',
+ snippets: 'Snippets',
+ archive: 'Archive',
+ },
+ tools: {
+ clarinet: {
+ title: 'Clarinet',
+ description: 'Development environment and testing framework for Clarity smart contracts.',
+ },
+ chainhook: {
+ title: 'Chainhook',
+ description: 'Monitor and analyze Clarity smart contract activity.',
+ },
+ contractMonitoring: {
+ title: 'Contract Monitoring',
+ description: 'Monitor and analyze Clarity smart contract activity.',
+ },
+ clarityVscode: {
+ title: 'Clarity VSCode Extension',
+ description: 'Monitor and analyze Clarity smart contract activity.',
+ },
+ bitcoinIndexer: {
+ title: 'Bitcoin Indexer',
+ description: 'Indexer for Bitcoin blockchain data.',
+ },
+ },
+ apis: {
+ apiKeys: {
+ title: 'API keys',
+ description: 'API keys for accessing Hiro APIs.',
+ },
+ rateLimits: {
+ title: 'Rate limits',
+ description: 'Rate limits for accessing Hiro APIs.',
+ },
+ stacksApi: {
+ title: 'Stacks API',
+ description: 'RESTful API for accessing Stacks blockchain data and functionality.',
+ },
+ stacksNodeRpcApi: {
+ title: 'Stacks Node RPC API',
+ description:
+ 'Raw blockchain node methods: submit txs, call read-only contracts, query mempool/state.',
+ },
+ tokenMetadata: {
+ title: 'Token Metadata API',
+ description: 'API for retrieving NFT and fungible token metadata.',
+ },
+ platform: {
+ title: 'Platform API',
+ description: 'API for accessing Hiro Platform data and functionality.',
+ },
+ ordinals: {
+ title: 'Ordinals API',
+ description: 'API for Bitcoin Ordinals and inscriptions data.',
+ },
+ runes: {
+ title: 'Runes API',
+ description: 'API for Bitcoin Runes data.',
+ },
+ signerMetrics: {
+ title: 'Signer Metrics API',
+ description: 'API for accessing Signer metrics data and functionality.',
+ },
+ },
+ libraries: {
+ stacksJs: {
+ title: 'Stacks.js',
+ description: 'JavaScript library for building on Stacks.',
+ },
+ stacksConnect: {
+ title: 'Stacks Connect',
+ description: 'JavaScript library for connecting to Stacks wallets.',
+ },
+ clarinetSdk: {
+ title: 'Clarinet JS SDK',
+ description: 'JavaScript SDK for Clarinet.',
+ },
+ clarinetBrowserSdk: {
+ title: 'Clarinet JS Browser SDK',
+ description: 'JavaScript SDK for Clarinet in the browser.',
+ },
+ },
+ resources: {
+ clarityReference: {
+ title: 'Clarity Reference',
+ description: 'Clarity language reference.',
+ },
+ guides: {
+ title: 'Guides',
+ description: 'Guides for building on Stacks.',
+ },
+ snippets: {
+ title: 'Snippets',
+ description: 'Code snippets for building on Stacks and Bitcoin.',
+ },
+ archive: {
+ title: 'Hiro Archive',
+ description: 'Archive of blockchain data.',
+ },
+ },
+};
diff --git a/lib/translations/es.ts b/lib/translations/es.ts
new file mode 100644
index 000000000..e11be14f8
--- /dev/null
+++ b/lib/translations/es.ts
@@ -0,0 +1,161 @@
+import type { Translations } from './types';
+
+export const es: Translations = {
+ navigation: {
+ signIn: 'Iniciar sesión',
+ menus: {
+ tools: 'Herramientas',
+ apis: 'APIs',
+ libraries: 'Bibliotecas y SDKs',
+ resources: 'Recursos',
+ },
+ search: 'Buscar',
+ searchAriaLabel: 'Buscar',
+ llmShare: {
+ copyMarkdown: 'Copiar markdown',
+ viewAsMarkdown: 'Ver como Markdown',
+ openIn: 'Abrir en',
+ askQuestions: 'Haz preguntas sobre esta página',
+ },
+ toc: {
+ contents: 'Contenidos',
+ },
+ feedback: {
+ question: '¿Cómo es esta guía?',
+ good: 'Buena',
+ bad: 'Mala',
+ thankYou: '¡Gracias por tus comentarios!',
+ viewHere: 'Ver aquí',
+ placeholder: 'Deja tus comentarios...',
+ submit: 'Enviar',
+ submitting: 'Enviando...',
+ },
+ },
+ breadcrumb: {
+ // Main sections
+ tools: 'Herramientas',
+ apis: 'APIs',
+ reference: 'Referencia',
+ resources: 'Recursos',
+
+ // Common terms
+ api: 'API',
+ cli: 'CLI',
+ rpc: 'RPC',
+ http: 'HTTP',
+ sdk: 'SDK',
+ sip: 'SIP',
+ bns: 'BNS',
+ stx: 'STX',
+ nft: 'NFT',
+ btc: 'BTC',
+ auth: 'Auth',
+
+ // Tools
+ clarinet: 'Clarinet',
+ chainhook: 'Chainhook',
+
+ // Specific pages/sections
+ guides: 'Guías',
+ clarity: 'Clarity',
+ snippets: 'Fragmentos',
+ archive: 'Archivo',
+ },
+ tools: {
+ clarinet: {
+ title: 'Clarinet',
+ description: 'Entorno de desarrollo y marco de pruebas para contratos inteligentes Clarity.',
+ },
+ chainhook: {
+ title: 'Chainhook',
+ description: 'Monitorear y analizar la actividad de contratos inteligentes Clarity.',
+ },
+ contractMonitoring: {
+ title: 'Monitoreo de Contratos',
+ description: 'Monitorear y analizar la actividad de contratos inteligentes Clarity.',
+ },
+ clarityVscode: {
+ title: 'Extensión VSCode de Clarity',
+ description: 'Monitorear y analizar la actividad de contratos inteligentes Clarity.',
+ },
+ bitcoinIndexer: {
+ title: 'Indexador de Bitcoin',
+ description: 'Indexador para datos de la blockchain de Bitcoin.',
+ },
+ },
+ apis: {
+ apiKeys: {
+ title: 'Claves de API',
+ description: 'Claves de API para acceder a las APIs de Hiro.',
+ },
+ rateLimits: {
+ title: 'Límites de tasa',
+ description: 'Límites de tasa para acceder a las APIs de Hiro.',
+ },
+ stacksApi: {
+ title: 'API de Stacks',
+ description: 'API RESTful para acceder a datos y funcionalidad de la blockchain Stacks.',
+ },
+ stacksNodeRpcApi: {
+ title: 'API de Nodo RPC de Stacks',
+ description:
+ 'Métodos de nodo blockchain sin procesar: enviar txs, llamar contratos de solo lectura, consultar mempool/estado.',
+ },
+ tokenMetadata: {
+ title: 'API de Metadatos de Tokens',
+ description: 'API para obtener metadatos de tokens NFT y fungibles.',
+ },
+ platform: {
+ title: 'API de Plataforma',
+ description: 'API para acceder a datos y funcionalidad de la Plataforma Hiro.',
+ },
+ ordinals: {
+ title: 'API de Ordinales',
+ description: 'API para datos de Ordinales de Bitcoin e inscripciones.',
+ },
+ runes: {
+ title: 'API de Runas',
+ description: 'API para datos de Runas de Bitcoin.',
+ },
+ signerMetrics: {
+ title: 'API de Métricas de Firmante',
+ description: 'API para acceder a datos y funcionalidad de métricas de Firmante.',
+ },
+ },
+ libraries: {
+ stacksJs: {
+ title: 'Stacks.js',
+ description: 'Biblioteca JavaScript para construir en Stacks.',
+ },
+ stacksConnect: {
+ title: 'Stacks Connect',
+ description: 'Biblioteca JavaScript para conectar con billeteras Stacks.',
+ },
+ clarinetSdk: {
+ title: 'SDK JS de Clarinet',
+ description: 'SDK de JavaScript para Clarinet.',
+ },
+ clarinetBrowserSdk: {
+ title: 'SDK de Navegador JS de Clarinet',
+ description: 'SDK de JavaScript para Clarinet en el navegador.',
+ },
+ },
+ resources: {
+ clarityReference: {
+ title: 'Referencia de Clarity',
+ description: 'Referencia del lenguaje Clarity.',
+ },
+ guides: {
+ title: 'Guías',
+ description: 'Guías para construir en Stacks.',
+ },
+ snippets: {
+ title: 'Fragmentos',
+ description: 'Fragmentos de código para construir en Stacks y Bitcoin.',
+ },
+ archive: {
+ title: 'Archivo de Hiro',
+ description: 'Archivo de datos de blockchain.',
+ },
+ },
+};
diff --git a/lib/translations/index.ts b/lib/translations/index.ts
new file mode 100644
index 000000000..139b186fa
--- /dev/null
+++ b/lib/translations/index.ts
@@ -0,0 +1,11 @@
+import { en } from './en';
+import { es } from './es';
+import type { Translations } from './types';
+
+export const translations: Record = {
+ en,
+ es,
+};
+
+export type { Translations };
+export { en, es };
diff --git a/lib/translations/types.ts b/lib/translations/types.ts
new file mode 100644
index 000000000..bd899b692
--- /dev/null
+++ b/lib/translations/types.ts
@@ -0,0 +1,158 @@
+export interface Translations {
+ navigation: {
+ signIn: string;
+ menus: {
+ tools: string;
+ apis: string;
+ libraries: string;
+ resources: string;
+ };
+ search: string;
+ searchAriaLabel: string;
+ llmShare: {
+ copyMarkdown: string;
+ viewAsMarkdown: string;
+ openIn: string;
+ askQuestions: string;
+ };
+ toc: {
+ contents: string;
+ };
+ feedback: {
+ question: string;
+ good: string;
+ bad: string;
+ thankYou: string;
+ viewHere: string;
+ placeholder: string;
+ submit: string;
+ submitting: string;
+ };
+ };
+ breadcrumb: {
+ // Main sections
+ tools: string;
+ apis: string;
+ reference: string;
+ resources: string;
+
+ // Common terms
+ api: string;
+ cli: string;
+ rpc: string;
+ http: string;
+ sdk: string;
+ sip: string;
+ bns: string;
+ stx: string;
+ nft: string;
+ btc: string;
+ auth: string;
+
+ // Tools
+ clarinet: string;
+ chainhook: string;
+
+ // Specific pages/sections
+ guides: string;
+ clarity: string;
+ snippets: string;
+ archive: string;
+ };
+ tools: {
+ clarinet: {
+ title: string;
+ description: string;
+ };
+ chainhook: {
+ title: string;
+ description: string;
+ };
+ contractMonitoring: {
+ title: string;
+ description: string;
+ };
+ clarityVscode: {
+ title: string;
+ description: string;
+ };
+ bitcoinIndexer: {
+ title: string;
+ description: string;
+ };
+ };
+ apis: {
+ apiKeys: {
+ title: string;
+ description: string;
+ };
+ rateLimits: {
+ title: string;
+ description: string;
+ };
+ stacksApi: {
+ title: string;
+ description: string;
+ };
+ stacksNodeRpcApi: {
+ title: string;
+ description: string;
+ };
+ tokenMetadata: {
+ title: string;
+ description: string;
+ };
+ platform: {
+ title: string;
+ description: string;
+ };
+ ordinals: {
+ title: string;
+ description: string;
+ };
+ runes: {
+ title: string;
+ description: string;
+ };
+ signerMetrics: {
+ title: string;
+ description: string;
+ };
+ };
+ libraries: {
+ stacksJs: {
+ title: string;
+ description: string;
+ };
+ stacksConnect: {
+ title: string;
+ description: string;
+ };
+ clarinetSdk: {
+ title: string;
+ description: string;
+ };
+ clarinetBrowserSdk: {
+ title: string;
+ description: string;
+ };
+ };
+ resources: {
+ clarityReference: {
+ title: string;
+ description: string;
+ };
+ guides: {
+ title: string;
+ description: string;
+ };
+ snippets: {
+ title: string;
+ description: string;
+ };
+ archive: {
+ title: string;
+ description: string;
+ };
+ };
+}
diff --git a/middleware.ts b/middleware.ts
index 7a236dd30..515d17c08 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,35 +1,46 @@
-import type { NextRequest } from 'next/server';
+import { createI18nMiddleware } from 'fumadocs-core/i18n';
+import type { NextFetchEvent, NextRequest } from 'next/server';
import { NextResponse } from 'next/server';
+import { i18n } from '@/lib/i18n';
-export function middleware(request: NextRequest) {
- const { pathname } = request.nextUrl;
-
- if (pathname.endsWith('.md')) {
- const pathWithoutMd = pathname.slice(0, -3);
-
- if (pathWithoutMd.match(/^\/apis\/[^/]+\/reference\//)) {
- // Rewrite to our openapi-markdown API route
- const apiPath = `/api/openapi-markdown${pathWithoutMd}`;
- return NextResponse.rewrite(new URL(apiPath, request.url));
- }
+const fumadocsMiddleware = createI18nMiddleware(i18n);
- if (pathWithoutMd === '/index') {
- return NextResponse.rewrite(new URL('/raw/index.mdx', request.url));
- }
+export default function middleware(request: NextRequest, event: NextFetchEvent) {
+ const { pathname } = request.nextUrl;
- if (pathWithoutMd.startsWith('/docs/') || pathWithoutMd === '/docs') {
- const docPath = pathWithoutMd.startsWith('/docs/') ? pathWithoutMd.slice(6) : '';
- const rawPath = `/raw/${docPath || 'index'}.mdx`;
- return NextResponse.rewrite(new URL(rawPath, request.url));
+ const segments = pathname.split('/').filter(Boolean);
+ const currentLocale = i18n.languages.includes(segments[0]) ? segments[0] : null;
+
+ // Get the referer to detect if user is coming from a localized page
+ const referer = request.headers.get('referer');
+
+ if (referer && !currentLocale) {
+ try {
+ const refererUrl = new URL(referer);
+ const refererSegments = refererUrl.pathname.split('/').filter(Boolean);
+ const refererLocale = i18n.languages.includes(refererSegments[0]) ? refererSegments[0] : null;
+
+ // If coming from a non-default locale page to a non-prefixed URL
+ if (refererLocale && refererLocale !== i18n.defaultLanguage) {
+ if (pathname.match(/^\/(tools|apis|resources|reference)\//)) {
+ return NextResponse.redirect(new URL(`/${refererLocale}${pathname}`, request.url));
+ }
+ }
+ } catch {
+ // Ignore invalid referer URLs
}
-
- const rawPath = `/raw${pathWithoutMd}.mdx`;
- return NextResponse.rewrite(new URL(rawPath, request.url));
}
- return NextResponse.next();
+ const result = fumadocsMiddleware(request, event);
+ return result;
}
export const config = {
- matcher: ['/(.*).md', '/docs/(.*).md'],
+ matcher: [
+ // Match .md files
+ '/(.*).md',
+ '/docs/(.*).md',
+ // Match all paths except Next.js internals, API routes, and static files
+ '/((?!_next|api/).*)', // This excludes /api/ but includes /apis/
+ ],
};
diff --git a/scripts/generate-llms-txt.ts b/scripts/generate-llms-txt.ts
index eb8263da0..3c87cdd0a 100644
--- a/scripts/generate-llms-txt.ts
+++ b/scripts/generate-llms-txt.ts
@@ -20,6 +20,7 @@ interface PageMetadata {
title: string;
description: string;
url: string;
+ cleanUrl: string;
section: string[];
}
@@ -33,10 +34,19 @@ function getAllPages(): PageMetadata[] {
const urlParts = page.url.split('/').filter(Boolean);
const section = urlParts.slice(0, -1); // All parts except the last one
+ // Clean URL for content links (remove locale prefix)
+ let cleanUrl = page.url;
+ const locales = ['en', 'es']; // Add your supported locales here
+ if (urlParts.length > 0 && locales.includes(urlParts[0])) {
+ // Remove the locale prefix for content links
+ cleanUrl = '/' + urlParts.slice(1).join('/');
+ }
+
return {
title: (page.data as any)?.title || page.file.name,
description: (page.data as any)?.description || '',
- url: page.url,
+ url: page.url, // Keep original URL for file path generation
+ cleanUrl: cleanUrl, // Add clean URL for content links
section: section,
};
})
@@ -96,11 +106,13 @@ function generateLLMsContent(
if (section === '_overview') {
// These are overview pages at the current level
for (const page of sectionPages) {
- const mdUrl =
- page.url === '/'
- ? `${config.productionUrl}/index.md`
- : `${config.productionUrl}${page.url}.md`;
- lines.push(`- [${page.title}](${mdUrl})${page.description ? `: ${page.description}` : ''}`);
+ const pageUrl =
+ page.cleanUrl === '/'
+ ? `${config.productionUrl}/`
+ : `${config.productionUrl}${page.cleanUrl}`;
+ lines.push(
+ `- [${page.title}](${pageUrl})${page.description ? `: ${page.description}` : ''}`,
+ );
}
if (sectionPages.length > 0) lines.push('');
} else if (section !== 'root') {
@@ -114,21 +126,25 @@ function generateLLMsContent(
}
for (const page of sectionPages) {
- const mdUrl =
- page.url === '/'
- ? `${config.productionUrl}/index.md`
- : `${config.productionUrl}${page.url}.md`;
- lines.push(`- [${page.title}](${mdUrl})${page.description ? `: ${page.description}` : ''}`);
+ const pageUrl =
+ page.cleanUrl === '/'
+ ? `${config.productionUrl}/`
+ : `${config.productionUrl}${page.cleanUrl}`;
+ lines.push(
+ `- [${page.title}](${pageUrl})${page.description ? `: ${page.description}` : ''}`,
+ );
}
lines.push('');
} else {
// Root level pages
for (const page of sectionPages) {
- const mdUrl =
- page.url === '/'
- ? `${config.productionUrl}/index.md`
- : `${config.productionUrl}${page.url}.md`;
- lines.push(`- [${page.title}](${mdUrl})${page.description ? `: ${page.description}` : ''}`);
+ const pageUrl =
+ page.cleanUrl === '/'
+ ? `${config.productionUrl}/`
+ : `${config.productionUrl}${page.cleanUrl}`;
+ lines.push(
+ `- [${page.title}](${pageUrl})${page.description ? `: ${page.description}` : ''}`,
+ );
}
if (sectionPages.length > 0) lines.push('');
}
@@ -174,9 +190,7 @@ async function generateAllLLMsTxt() {
// Create llms.txt for each section
for (const [sectionPath, sectionPages] of sections) {
const sectionParts = sectionPath.split('/');
- const sectionTitle = `${sectionParts
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
- .join(' ')} Documentation`;
+ const sectionTitle = 'Documentation';
const sectionContent = generateLLMsContent(sectionPages, sectionTitle, sectionParts);
const outputPath = path.join(PUBLIC_DIR, sectionPath);