> 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/guias-para-desarrolladores/call-solana-from-evm.md).

# Llamar a Solana desde EVM

Llama a programas de Solana desde Solidity mediante la CPI de Rome y precompilados auxiliares.

Los precompilados de Rome permiten que los contratos de Solidity llamen directamente a programas de Solana. Esta guía cubre los mecanismos.

## Requisitos previos

* Los interfaces Solidity de Rome del [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) repositorio (instalado desde GitHub, no desde npm — vea [Desplegar Solidity](/es/guias-para-desarrolladores/deploy-solidity.md#using-the-rome-solidity-sdk)) — las interfaces de precompilado están en [`contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol)
* Un contrato de Rome desplegado (vea [Desplegar Solidity](/es/guias-para-desarrolladores/deploy-solidity.md))

Vincule cada interfaz a su dirección de precompilado:

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

ICrossProgramInvocation constant CpiProgram    = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
ISystemProgram          constant SystemProgram = ISystemProgram(0xFF00000000000000000000000000000000000007);
IHelperProgram          constant Helper        = IHelperProgram(0xFF00000000000000000000000000000000000009);
```

## El precompilado CpiProgram

`CpiProgram` (`0xFF…08`) despacha CPI (`invoke` / `invoke_signed`) además de atajos de lectura entre estados (`account_info`, `account_data_at`, `account_u64_at`, `account_lamports`, `pdas_batch_derive`):

```solidity
// Llamar a un programa de Solana
CpiProgram.invoke(programId, accounts, instructionData);

// Llamar con firma de PDA: la PDA de autoridad externa de su contrato firma, más una
// sub-PDA con sal por cada entrada en `salts` (Rome deriva ["EXTERNAL_AUTHORITY", contract, salt])
CpiProgram.invoke_signed(programId, accounts, data, salts);
```

## Transferir lamports

Para transferencias simples de lamports y SPL, use el precompilado HelperProgram — no se necesita una CPI construida a mano. Un contrato que lo llama actúa como **sí mismo**: las transferencias de abajo mueven los propios lamports y tokens del contrato (firma su PDA de autoridad externa), no los del usuario. Para que un contrato extraiga los tokens SPL de un usuario hacia una cuenta de tokens que controla, y sepa de quién son, el usuario concede una delegación SPL. Un ERC-20 `transfer` o `transferFrom` a un contrato solo acredita el libro mayor de custodia del envoltorio y no le da al contrato ninguna cuenta de tokens desde la que gastar — vea [Integrar un programa de Solana](/es/guias-para-desarrolladores/integrate-solana-program.md).

```solidity
contract Transfers {
    IHelperProgram constant Helper = IHelperProgram(0xFF00000000000000000000000000000000000009);

    // Transferir lamports desde la PDA de este contrato a la PDA de una dirección EVM
    function transferSol(address to, uint64 lamports) external {
        Helper.transfer_lamports(to, lamports);
    }

    // Transferir un token SPL desde la cuenta de tokens propiedad de la PDA de este contrato
    function transferSpl(address to, uint64 tokens, bytes32 mint) external {
        Helper.transfer_spl(to, tokens, mint);
    }

    // Crea el ATA del llamador para un mint
    function createAta(bytes32 mint) external {
        Helper.create_ata(msg.sender, mint);
    }
}
```

`transfer_spl` tiene varias sobrecargas (incluida una variante de delegado para `transferFrom` flujos); ver `interface.sol`. En la ruta en caché, use `ISplCached` (`0xff…05`) / `IAssociatedSplCached` (`0xff…06`) en su lugar — un contrato usa una sola ruta de forma consistente, y solo la ruta heredada puede `invoke` un programa personalizado (vea [Integrar un programa de Solana](/es/guias-para-desarrolladores/integrate-solana-program.md)).

## Lectura de datos de cuenta

Lea los datos de cualquier cuenta de Solana mediante los atajos de lectura de CpiProgram:

```solidity
(
    uint64 lamports,
    bytes32 owner,
    bool isSigner,
    bool isWritable,
    bool executable,
    bytes memory data
) = CpiProgram.account_info(accountPubkey);
```

## Derivación de PDA

Encuentre direcciones derivadas de programa desde Solidity mediante el precompilado System:

```solidity
ISystemProgram.Seed[] memory seeds = new ISystemProgram.Seed[](2);
seeds[0] = ISystemProgram.Seed("my-program-seed");
seeds[1] = ISystemProgram.Seed(abi.encodePacked(someValue));

(bytes32 pda, uint8 bump) = SystemProgram.find_program_address(targetProgramId, seeds);
```

## Conversión a Base58

Convertir entre `bytes32` y base58 (el formato de direcciones de Solana):

```solidity
bytes memory base58Str = SystemProgram.bytes32_to_base58(pubkey);
bytes32 pubkey = SystemProgram.base58_to_bytes32(base58Bytes);
```

## Llamar a programas personalizados de Solana

Para llamar a cualquier programa de Solana, construya usted mismo la lista de cuentas y los datos de instrucción:

```solidity
contract CustomCPI {
    ICrossProgramInvocation constant CpiProgram = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
    bytes32 constant MY_PROGRAM = 0x0000000000000000000000000000000000000000000000000000000000000000; // su ID de programa de Solana

    function callMyProgram(bytes32 account1, bytes32 account2, bytes calldata ixData) external {
        ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
        accounts[0] = ICrossProgramInvocation.AccountMeta(account1, false, true);
        accounts[1] = ICrossProgramInvocation.AccountMeta(account2, false, false);

        CpiProgram.invoke(MY_PROGRAM, accounts, ixData);
    }
}
```

## Restricciones clave

1. **Todas las cuentas deben declararse de antemano.** La transacción de Solana debe incluir todas las cuentas que la CPI tocará — no es posible el descubrimiento dinámico de cuentas dentro de la CPI.
2. **Límite de profundidad de la CPI: 4 niveles.** Rome EVM → su destino → la llamada del destino → una más. Planifique la profundidad de su llamada.
3. **Las claves públicas de Solana son `bytes32`,** no direcciones de Ethereum de 20 bytes.
4. **Los datos de instrucción son bytes en bruto** en el formato que espera el programa destino (normalmente Borsh, little-endian).

## Qué sigue

* **Véalo en una aplicación real** — [cardo](https://github.com/rome-protocol/cardo) envía llamadas CPI al precompilado directamente desde la cartera del usuario, sin contrato adaptador; [rome-dex](https://github.com/rome-protocol/rome-dex) (AMM de doble carril) hace lo mismo y además tiene un contrato enrutador sin custodia; [aerarium](https://github.com/rome-protocol/aerarium) es una aplicación de préstamos que no llama a programas de Solana desde Solidity.
* [Integrar un programa de Solana](/es/guias-para-desarrolladores/integrate-solana-program.md) — la identidad de Solana del usuario, firmando como ella, la regla de una sola ruta y el aprovisionamiento de cuentas para un programa real al otro lado
* [Referencia de precompilados](/es/referencia/precompiles.md) — cada selector en cada precompilado
* [Llamar a EVM desde Solana](/es/guias-para-desarrolladores/call-evm-from-solana.md) — lo contrario: controlar contratos EVM desde una cartera de Solana
* [Interop de tokens](/es/conceptos-basicos/token-interop.md) — cómo trabajan juntos los tokens ERC-20 y SPL
* [Restricciones](/es/conceptos-basicos/constraints.md) — la profundidad de la CPI y otros límites


---

# 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/guias-para-desarrolladores/call-solana-from-evm.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.
