从 EVM 调用 Solana
前置条件
CPI 预编译
import {CpiProgram} from "@rome-protocol/solidity-sdk/contracts/core/Precompiles.sol";
// 调用 Solana 程序
CpiProgram.invoke(programId, accounts, instructionData);
// 使用 PDA 签名调用(你的合约作为 PDA 签名)
CpiProgram.invoke_signed(programId, accounts, data, seeds);基础示例:转移 SOL
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {SystemProgram, CpiProgram} from "@rome-protocol/solidity-sdk/contracts/core/Precompiles.sol";
import {RomeEVMAccount} from "@rome-protocol/solidity-sdk/contracts/core/RomeEVMAccount.sol";
contract SolTransfer {
function transferSol(bytes32 recipient, uint64 lamports) external {
// 获取发送方的 PDA
bytes32 senderPda = RomeEVMAccount.pda(msg.sender);
// 构建 System Program 转账指令
ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
accounts[0] = ICrossProgramInvocation.AccountMeta(senderPda, true, true); // 发送方(签名者,可写)
accounts[1] = ICrossProgramInvocation.AccountMeta(recipient, false, true); // 接收方(可写)
// System Program 转账指令(变体 2,小端 u64 金额)
bytes memory data = abi.encodePacked(uint32(2), lamports);
CpiProgram.invoke(SystemProgram.program_id(), accounts, data);
}
}读取账户数据
使用 SPL Token
PDA 推导
Base58 转换
调用自定义 Solana 程序
关键限制
下一步
最后更新于
这有帮助吗?