> 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/pt-br/guias-do-desenvolvedor/call-solana-from-evm.md).

# Chamar Solana a partir da EVM

Chame programas da Solana a partir de Solidity via a CPI da Rome e precompilações auxiliares.

As precompilações da Rome permitem que contratos Solidity chamem programas Solana diretamente. Este guia aborda a mecânica.

## Pré-requisitos

* As interfaces Solidity da Rome do repositório público [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) repo (instalado do GitHub, não do npm — veja [Implante em Solidity](/pt-br/guias-do-desenvolvedor/deploy-solidity.md#using-the-rome-solidity-sdk)) — as interfaces de precompilação ficam em [`contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol)
* Um contrato Rome implantado (veja [Implante em Solidity](/pt-br/guias-do-desenvolvedor/deploy-solidity.md))

Associe cada interface ao seu endereço de precompilação:

```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);
```

## A precompilação CpiProgram

`CpiProgram` (`0xFF…08`) despacha CPI (`invoke` / `invoke_signed`) além de atalhos de leitura de cross-state (`account_info`, `account_data_at`, `account_u64_at`, `account_lamports`, `pdas_batch_derive`):

```solidity
// Chame um programa da Solana
CpiProgram.invoke(programId, accounts, instructionData);

// Chame com assinatura de PDA: o PDA de autoridade externa do seu contrato assina, além de um
// sub-PDA com salt por entrada em `salts` (Rome deriva ["EXTERNAL_AUTHORITY", contract, salt])
CpiProgram.invoke_signed(programId, accounts, data, salts);
```

## Transferir lamports

Para transferências simples de lamports e SPL, use a precompilação HelperProgram — não é necessário montar a CPI manualmente. Um contrato que a chama atua como **ele mesmo**: os valores abaixo transferem os próprios lamports e tokens do contrato (o PDA de autoridade externa dele assina), não os do usuário. Para um contrato puxar os tokens SPL de um usuário para uma conta de token que ele controla, e saber de quem eles são, o usuário concede uma delegação SPL. Um ERC-20 `transfer` ou `transferFrom` para um contrato apenas credita o livro-razão de custódia do wrapper e não dá ao contrato nenhuma conta de token da qual gastar — veja [Integrar um programa Solana](/pt-br/guias-do-desenvolvedor/integrate-solana-program.md).

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

    // Transfira lamports do PDA deste contrato para o PDA de um endereço EVM
    function transferSol(address to, uint64 lamports) external {
        Helper.transfer_lamports(to, lamports);
    }

    // Transfira um token SPL da conta de token pertencente ao PDA deste contrato
    function transferSpl(address to, uint64 tokens, bytes32 mint) external {
        Helper.transfer_spl(to, tokens, mint);
    }

    // Crie a ATA do chamador para um mint
    function createAta(bytes32 mint) external {
        Helper.create_ata(msg.sender, mint);
    }
}
```

`transfer_spl` tem várias sobrecargas (inclusive uma variante delegate para `transferFrom` fluxos); veja `interface.sol`. No caminho em cache, use `ISplCached` (`0xff…05`) / `IAssociatedSplCached` (`0xff…06`) em vez disso — um contrato usa um único caminho de forma consistente, e somente o caminho legado pode `invoke` um programa personalizado (veja [Integrar um programa Solana](/pt-br/guias-do-desenvolvedor/integrate-solana-program.md)).

## Lendo dados da conta

Leia os dados de qualquer conta Solana por meio dos atalhos de leitura do CpiProgram:

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

## Derivação de PDA

Encontre Program Derived Addresses a partir de Solidity via a precompilação 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);
```

## Conversão para Base58

Converta entre `bytes32` e Base58 (formato de endereços da Solana):

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

## Chamando programas Solana personalizados

Para chamar qualquer programa Solana, monte você mesmo a lista de contas e os dados da instrução:

```solidity
contract CustomCPI {
    ICrossProgramInvocation constant CpiProgram = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
    bytes32 constant MY_PROGRAM = 0x0000000000000000000000000000000000000000000000000000000000000000; // seu ID de programa 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);
    }
}
```

## Restrições principais

1. **Todas as contas devem ser declaradas antecipadamente.** A transação da Solana deve incluir toda conta que a CPI tocará — não é possível descobrir contas dinamicamente dentro da CPI.
2. **Limite de profundidade da CPI: 4 níveis.** Rome EVM → seu alvo → a chamada do alvo → mais uma. Planeje a profundidade da sua chamada.
3. **As pubkeys da Solana são `bytes32`,** não endereços Ethereum de 20 bytes.
4. **Os dados da instrução são bytes brutos** no formato que o programa-alvo espera (normalmente Borsh, little-endian).

## O que Vem a Seguir

* **Veja isso em um app real** — [cardo](https://github.com/rome-protocol/cardo) envia chamadas CPI para a precompilação diretamente da carteira do usuário, sem contrato adaptador; [rome-dex](https://github.com/rome-protocol/rome-dex) (AMM de duas vias) faz o mesmo e também tem um contrato roteador sem custódia; [aerarium](https://github.com/rome-protocol/aerarium) é um app de empréstimos que não chama programas Solana a partir de Solidity.
* [Integrar um programa Solana](/pt-br/guias-do-desenvolvedor/integrate-solana-program.md) — a identidade Solana do usuário, assinando como ela, a regra de um único caminho e o provisionamento de contas para um programa real do outro lado
* [Referência de precompilados](/pt-br/referencia/precompiles.md) — todos os seletores em todas as precompilações
* [Chamar EVM a partir da Solana](/pt-br/guias-do-desenvolvedor/call-evm-from-solana.md) — o inverso: controlar contratos EVM a partir de uma carteira Solana
* [Interoperabilidade de tokens](/pt-br/conceitos-principais/token-interop.md) — como tokens ERC-20 e SPL funcionam juntos
* [Restrições](/pt-br/conceitos-principais/constraints.md) — profundidade da CPI e outros limites


---

# 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/pt-br/guias-do-desenvolvedor/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.
