> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/es/productos/rome-sdk.md).

# Rome SDK

Interfaces Solidity tipadas para llamar a programas de Solana desde contratos EVM, además del SDK en Rust detrás de los servicios fuera de cadena de Rome.

El SDK de Rome proporciona interfaces tipadas de Solidity para interactuar con programas de Solana desde contratos inteligentes EVM. Es el kit de herramientas para desarrolladores para construir aplicaciones entre runtimes en Rome.

## SDKs

Rome tiene SDKs para tres públicos: desarrolladores de aplicaciones (TypeScript), desarrolladores de contratos (Solidity) y equipos que ejecutan sus propios servicios en Rome (Rust).

### SDK de TypeScript (`@rome-protocol/sdk`)

**Para desarrolladores de dapps y frontend** — el SDK con el que empiezan la mayoría de los desarrolladores de aplicaciones. [`@rome-protocol/sdk`](https://github.com/rome-protocol/rome-sdk-ts) envuelve la ruta de escritura de Rome para que una app web envíe correctamente transacciones de Rome: `submitRomeTx` (la ruta de escritura correcta más el manejo de gas/tarifas), derivación de PDA / ATA, CPI `invoke` / `invoke_signed` codificadores, enlaces de precompilación, y una `/bridge` subruta. Instalación primero desde el repositorio (publicación en npm pendiente):

```bash
npm install github:rome-protocol/rome-sdk-ts#v0.4.0
```

```typescript
import { submitRomeTx } from '@rome-protocol/sdk';
// Envía cualquier escritura EVM de Rome a través de la ruta de escritura correcta (maneja la codificación de gas/tarifas).
```

La pública [rome-dex](https://github.com/rome-protocol/rome-dex) app usa solo unos pocos de los ayudantes del SDK (derivación de PDA y de cuentas de token, el CPI `invoke` codificador y el margen de gas 1.3x), y [cardo](https://github.com/rome-protocol/cardo) no depende de él. Ninguno llama `submitRomeTx` o `submitRomeTxV1`, así que léelos para ver cómo una app llama al precompilado CPI, no para la ruta de escritura del SDK.

**Dos vías, un solo SDK.** `submitRomeTx` es la vía EVM (MetaMask). Para la **vía Solana** — una wallet de Solana que impulsa tu app EVM — `submitRomeTxV1` la replica: el proxy compone una transacción Solana v1 para la llamada, la wallet firma dos veces con la misma clave (un mensaje de autorización legible, luego la transacción), y Rome ejecuta la llamada como una transacción EVM desde la identidad derivada del usuario, sin clave EVM. Una llamada que no cabe en una transacción es reenviada por el proxy con la misma firma de autorización, y `fundSyntheticGas` recarga el gas nativo que gasta una llamada reenviada. Una llamada reenviada que revierte se resuelve con `receipt.status === "0x0"` en lugar de lanzar una excepción, así que revísalo; la [sección de llamadas reenviadas y llamadas largas](/es/guias-para-desarrolladores/call-evm-from-solana.md#relayed-calls-and-long-calls) tiene la regla del gas y los límites. El valor entra y sale a través de `buildFundLeg` / `buildSweepLeg` como un envoltorio ERC-20 (p. ej. `wUSDC`), no nativo `msg.value` — el emisor sintético no mantiene nada en reposo — y un sintético de primera vez se aprovisiona una sola vez, explícitamente, con `buildCreatePdaCall`. El anterior `submitRomeTxSolanaLane`, que construye una transacción heredada de Solana en el cliente, sigue en el SDK. Consulta [Construir una app de doble carril](/es/guias-para-desarrolladores/dual-lane-app.md) y [Llamar a EVM desde Solana](/es/guias-para-desarrolladores/call-evm-from-solana.md).

### SDK de Solidity (`@rome-protocol/rome-solidity`)

**Para desarrolladores de Solidity.** Proporciona las interfaces de precompilación, envoltorios ERC-20/SPL, derivación de PDA y utilidades de CPI. La publicación en npm está pendiente; hoy se consumen desde el [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) repositorio público (dependencia git o archivos copiados).

```solidity
import {ISystemProgram, ICrossProgramInvocation, IHelperProgram, IWithdraw}
    from "@rome-protocol/rome-solidity/contracts/interface.sol";
import {SPL_ERC20} from "@rome-protocol/rome-solidity/contracts/erc20spl/erc20spl.sol";
import {RomeEVMAccount} from "@rome-protocol/rome-solidity/contracts/rome_evm_account.sol";
```

### SDK de Rust (`rome-sdk`)

**Para equipos que ejecutan sus propios servicios en Rome.** Un workspace de Rust que maneja la composición de transacciones, la interacción con Solana, la fijación de precios de gas y la indexación de bloques. Proxy y Hercules están construidos sobre él. El código fuente está en [`rome-protocol/rome-sdk`](https://github.com/rome-protocol/rome-sdk). Envía transacciones Solana v1 (4 KB, hasta 64 cuentas).

**Compilarlo.** El workspace espera que los repositorios [`rome-sdk`](https://github.com/rome-protocol/rome-sdk), [`rome-evm`](https://github.com/rome-protocol/rome-evm) y [`mollusk`](https://github.com/rome-protocol/mollusk) estén clonados uno al lado del otro, porque depende de los otros dos mediante una ruta relativa. Esa es también la razón por la que la forma admitida de usarlo desde otro proyecto es una dependencia por ruta, no una simple dependencia git. Necesitas Rust 1.85 o posterior y acceso a la red para la primera compilación. `rome-evm` no tiene una característica de red predeterminada, así que cualquier compilación que lo compile necesita exactamente una de `ci`, `testnet` o `mainnet`; usa `ci` para trabajo local, por ejemplo `cargo test -p rome-sdk --features ci`. El README del repositorio tiene los pasos completos y la tabla de características.

**Licencia.** El SDK de Rust tiene el código fuente disponible, no es de código abierto: todos los derechos están reservados y puede usarse para fines personales y no comerciales. El uso comercial necesita permiso por escrito de Rome Protocol; el `LICENSE` explica cómo solicitarlo.

## SDK de Solidity: qué incluye

### Interfaces de precompilación

Vincula una interfaz a su dirección de precompilación:

```solidity
ISystemProgram          constant System   = ISystemProgram(0xFF00000000000000000000000000000000000007);
ICrossProgramInvocation constant Cpi      = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
IHelperProgram          constant Helper   = IHelperProgram(0xFF00000000000000000000000000000000000009);
IWithdraw               constant Withdraw = IWithdraw(0x4200000000000000000000000000000000000016);
// Ruta en caché: ISplCached 0xff…05, IAssociatedSplCached 0xff…06, ISystemCached 0xff…04, IWithdrawCached 0xff…0b
```

### Operaciones de tokens SPL

Usa `IHelperProgram` (`0xff…09`) para primitivas SPL firmadas por el PDA del usuario:

```solidity
// Crea el ATA del llamador para un mint
Helper.create_ata(user, mint);

// Transfiere SPL desde el PDA del llamador
Helper.transfer_spl(to, tokens, mint);
```

En la ruta en caché, las operaciones equivalentes están en `ISplCached` (`0xff…05`) y `IAssociatedSplCached` (`0xff…06`). Consulta `interface.sol` para todas las sobrecargas; un contrato usa una ruta de forma consistente.

### Derivación de PDA

```solidity
// Deriva el PDA de Solana de un usuario
bytes32 userPda = RomeEVMAccount.pda(msg.sender);

// Deriva un PDA con sal (para crear múltiples PDAs por usuario)
bytes32 pda = RomeEVMAccount.pda_with_salt(msg.sender, salt);

// Encuentra un PDA arbitrario
(bytes32 pda, uint8 bump) = SystemProgram.find_program_address(programId, seeds);
```

### Invocación entre programas

```solidity
// Llama a cualquier programa de Solana
ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
accounts[0] = ICrossProgramInvocation.AccountMeta(signerPda, true, true);
accounts[1] = ICrossProgramInvocation.AccountMeta(targetAccount, false, true);

CpiProgram.invoke(programId, accounts, instructionData);

// Llama con firma de PDA
CpiProgram.invoke_signed(programId, accounts, data, seeds);

// Leer datos de la cuenta
(uint64 lamports, bytes32 owner, bool isSigner, bool isWritable, bool executable, bytes memory data)
    = CpiProgram.account_info(pubkey);
```

### ERC-20 sobre tokens SPL

```solidity
// Despliega un wrapper para cualquier mint SPL
ERC20SPLFactory factory = ERC20SPLFactory(FACTORY_ADDRESS);
address wrapper = factory.add_spl_token_with_metadata(splMint);

// Usa el wrapper como un ERC-20 estándar
SPL_ERC20 token = SPL_ERC20(wrapper);
token.transfer(recipient, amount);
uint256 balance = token.balanceOf(user);
```

### Deserialización Borsh

```solidity
import {Convert} from "@rome-protocol/rome-solidity/contracts/convert.sol";

// Analiza los datos de la cuenta de Solana (formato Borsh en little-endian)
(uint64 value, uint256 newOffset) = Convert.read_u64le(data, offset);
(bytes32 pubkey, uint256 newOffset2) = Convert.read_bytes32(data, offset);
```

### Metadatos de Metaplex

```solidity
import {MplTokenMetadataLib} from "@rome-protocol/rome-solidity/contracts/mpl_token_metadata/lib.sol";

// Carga los metadatos del token desde Metaplex
MplTokenMetadataLib.Metadata memory meta = MplTokenMetadataLib.load_metadata(
    mintPubkey, mplProgramId, cpiAddress
);
string memory name = meta.name;
string memory symbol = meta.symbol;
```

## SDK de Rust: arquitectura

El SDK de Rust es un workspace de Cargo. Sus crates principales:

| Crate               | Propósito                                                                                                                                                                             |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rome-sdk`          | API central: `Rome` estructura, configuración, tipos de transacción (RheaTx, RemusTx, RomulusTx)                                                                                      |
| `rome-evm-client`   | cliente de rollup EVM, TxBuilder, ResourceFactory, integración con el emulador                                                                                                        |
| `rome-solana`       | torre de Solana, cliente RPC, procesamiento por lotes y seguimiento de transacciones                                                                                                  |
| `rome-utils`        | RLP, hex, JSON-RPC, utilidades de autenticación                                                                                                                                       |
| `rome-obs`          | observabilidad de OpenTelemetry (trazas, métricas, registros)                                                                                                                         |
| `rome-meteora`      | lectores de pools DAMM v1 y v2 de Meteora para precios de gas                                                                                                                         |
| `rome-meta-hook`    | Cliente para el programa Meta-Hook Router: configuración de transfer-hook de Token-2022, resolución de cuentas adicionales, transferencias con estimaciones de presupuesto de cómputo |
| `rome-jito-bundler` | Constructor de bundles de Jito para envío atómico de múltiples transacciones                                                                                                          |

### Tipos de transacción

```rust
// Transacción única de rollup
let rhea = RheaTx::new(signed_eth_tx);
let mut tx = rome.compose_rollup_tx(rhea).await?;
let sig = rome.send_and_confirm(&mut *tx).await?;

// Transacción atómica entre rollups
let remus = RemusTx::new(vec![tx1, tx2]);
let mut tx = rome.compose_cross_rollup_tx(remus).await?;

// Transacción atómica entre cadenas (EVM + Solana)
let romulus = RomulusTx::new(eth_txs, sol_ixs);
let mut tx = rome.compose_cross_chain_tx(romulus, signers).await?;
```

### Agrupación de recursos

El SDK agrupa pares de claves de Solana (pagadores) e índices de cuentas holder para el envío paralelo de transacciones:

```rust
let resource = resource_factory.get().await?;
let payer = resource.payer();       // Par de claves de Solana
let holder = resource.holder();     // Índice de cuenta holder
// El recurso se devuelve automáticamente al grupo al hacer Drop
```

## Hoja de ruta del SDK

### Construido y en funcionamiento

* Wrappers de tokens SPL e interfaces de precompilación
* swaps de Meteora DAMM v1 vía CPI
* Oracle Gateway V1 + V2 (Pyth Pull, Switchboard V3)
* Utilidades del System Program, deserialización Borsh
* Fábrica ERC20SPL + contratos de puente

## Qué sigue

* [Desplegar Solidity](/es/guias-para-desarrolladores/deploy-solidity.md) — despliega tu primer contrato usando el SDK
* [Llamar a Solana desde EVM](/es/guias-para-desarrolladores/call-solana-from-evm.md) — usa CPI para interactuar con programas de Solana
* [Contract Addresses](/es/referencia/contract-addresses.md) — direcciones de contratos del SDK desplegados


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.rome.builders/es/productos/rome-sdk.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
