> 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/ko/developer-guides/open-to-solana-users.md).

# 컨트랙트를 Solana 사용자에게 공개하기

Rome(Hadrian 테스트넷, Rubicon 메인넷)에 Solidity 계약을 배포하고 Solana 지갑에 개방하세요 — 계약에 필요한 것, Solana 지갑 사용자가 어떻게 호출하는지, 각 네트워크의 주소, 그리고 출시 체

하나의 배포, 두 종류의 사용자. Rome의 계약은 MetaMask 사용자가 EVM 키로, Solana 지갑 사용자(예: Solflare)가 Solana 키로 도달합니다 — 같은 주소, 같은 상태. 이 페이지는 배포부터 계약을 Solana용으로 준비하고, 앱에 Solana 경로를 연결해 메인넷에 출시하기까지의 엔드투엔드 경로입니다.

## 1. 원하는 네트워크에 배포하기

Rome 체인은 표준 EVM 대상입니다: Hardhat, Foundry, viem, ethers가 변경 없이 동작합니다(전체 안내는 [Solidity 컨트랙트 배포](/ko/developer-guides/deploy-solidity.md)).

| 네트워크                                         | 체인 ID    | RPC                                         | 익스플로러                                                                                 | 가스 토큰    | 가스 받는 방법                                                                                                                                |
| -------------------------------------------- | -------- | ------------------------------------------- | ------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| [**Rubicon**](/ko/networks/rubicon.md) (메인넷) | `7531`   | `https://rubicon.mainnet.romeprotocol.xyz/` | [via-rubicon.mainnet.romeprotocol.xyz](https://via-rubicon.mainnet.romeprotocol.xyz/) | USDC     | 이더리움(CCTP)에서 USDC를 브리지하거나 Solana에서 다음을 사용해 [Rome Bridge](https://bridge-api.mainnet.romeprotocol.xyz/); 가스로 들어갑니다                       |
| **Hadrian** (테스트넷)                           | `200010` | `https://hadrian.testnet.romeprotocol.xyz/` | [via-hadrian.testnet.romeprotocol.xyz](https://via-hadrian.testnet.romeprotocol.xyz/) | 테스트 USDC | 테스트넷에서 테스트 USDC를 브리지하거나([수전](/ko/resources/faucets.md)) 또는 다음의 Solana devnet 지갑에서 래핑하세요 [Rome App](https://app.devnet.romeprotocol.xyz) |

가스는 EVM 측에서 소수점 18자리의 USDC이며, 어떤 네트워크에도 Rome faucet은 없습니다. 쓰기 작업은 Ethereum 직관보다 더 많은 가스를 소모하는데, 대부분의 비용이 Solana 계정 생성에 들어가기 때문입니다: 한 번도 사용되지 않은 수신자, 새 토큰 계정, 배포된 계약. 다음을 사용하세요 `eth_estimateGas`, 표준 도구가 그렇게 하며, 21,000을 하드코딩하지 마세요. Hadrian에서 측정한 결과, 10바이트 계약 배포는 1,147,921 가스로 추정되고 실제로 사용되었으며, 한 번도 사용된 적 없는 주소로의 네이티브 전송은 1,086,961이었습니다. 기존 주소로의 전송은 21,000이었습니다. Rome은 실제로 사용된 가스만 청구하며, 이 측정에서는 추정치를 넘지 않았습니다. 첫 배포 전에 몇 개의 USDC를 채워 두세요. 이후 익스플로러에서 소스를 검증하세요([컨트랙트 검증](/ko/developer-guides/verify-contracts.md); 메인넷 검증기는 `https://verify.mainnet.romeprotocol.xyz`).

Hadrian에서 개발한 뒤, 체인 ID와 메인넷 래퍼 주소만 바꿔 동일한 아티팩트를 Rubicon에 재배포하세요. 계약 자체는 네트워크 간에 바뀌지 않습니다. Rubicon은 아직 공개 레지스트리에 없으므로, `create-rome-app` 또는 `rome-cli` 아직은 없어서, 거기서 체인 값을 읽는 도구는 이를 대상으로 할 수 없습니다; 값은 다음에서 수동으로 채우세요 [Rubicon](/ko/networks/rubicon.md). Rubicon의 가스는 실제 USDC이며 Hadrian의 가스 가격보다 약 10배이므로, 그곳의 배포에는 실제 비용이 듭니다.

## 2. 계약을 Solana용으로 준비하는 방법

Solana 사용자의 EVM ID는 다음입니다 **합성 주소**, `keccak256(solana_pubkey)[12:]`: 일반적인 `msg.sender`, 일반적인 nonce를 가진 것입니다. 대부분의 계약은 전혀 변경이 필요 없습니다. 중요한 세 가지는 다음과 같습니다:

* **가치는 ERC-20으로 받고,  `msg.value`.** Solana 사용자의 자금은 지갑 안의 SPL 토큰이며, EVM 측에서는 토큰의 래퍼(`wUSDC`, `wETH`, `wSOL`). 합성 계정은 평상시 아무것도 보유하지 않고, 사용자의 자산은 래퍼 형태로 들어오므로, 다음으로 끌어오세요 `transferFrom` 이후에 `approve` 그리고 다음으로 반환하며 `전송에서는 후크가 작동하지 않습니다`.[한 번만: 래퍼에 허가 부여](/ko/developer-guides/dual-lane-app.md#one-time-grant-the-wrapper)) 각 사용자는 첫 끌어오기 전에 래퍼에 자신의 SPL 위임 권한을 한 번 부여합니다( `payable` 엔트리포인트는 합성 계정에 네이티브 가스가 주어져야만 동작합니다(릴레이 경로의 `rome_composeExternalDepositV1`), 그런데 fund-and-sweep 모델은 그렇게 하지 않습니다. 기존 ERC-20 볼트, AMM 또는 대출 마켓은 이미 올바른 형태를 갖추고 있습니다.
* **표준 래퍼를 사용하세요.** 각 체인에는 민트당 래퍼 하나가 있으며, 주소는 다음에 있습니다 [컨트랙트 주소](/ko/reference/contract-addresses.md) (Hadrian의 것도 공개 [레지스트리](https://github.com/rome-protocol/rome-registry)). 생성자는 그 주소들을 가리키게 하세요; 직접 배포하지 마세요.
* **지갑이 서명하는 곳의 원자적 예산에 맞추세요.** Solana 지갑은 Solana 트랜잭션 하나에 서명하므로, Solana 경로 호출은 그 안에 들어가야 합니다: 약 140만 compute units, 64개 계정, 4 KB([제약 사항](/ko/core-concepts/constraints.md)). Hadrian에서 측정한 결과: transfer, approve, Aave supply는 들어갔고, Uniswap V3 swap은 여유가 거의 없는 상태로 들어갔습니다(약 124만 CU). Aave borrow는 들어가지 않아 다음 섹션의 릴레이 경로를 탑니다. Solana receipt의 `computeUnitsConsumed`, 트랜잭션을 요청할 때 `maxSupportedTransactionVersion: 1` (Rome 구간은 v1 트랜잭션입니다; 이것이 없으면 필드가 0으로 읽힙니다).

필요하지 않은 것: Solana 프로그램, 브리지, 두 번째 배포, 또는 Rome 전용 Solidity. 계약이 precompile을 통해 Solana 프로그램도 호출한다면, 다음을 보세요 [EVM에서 Solana 호출](/ko/developer-guides/call-solana-from-evm.md).

## 3. Solana 지갑이 호출하게 하세요

앱의 EVM 경로는 변하지 않습니다(MetaMask + `submitRomeTx`, 또는 순수 viem/ethers). Solana 경로에는 두 가지 형태가 있습니다.

**SDK 경로 — 호출당 Solana v1 트랜잭션 하나.** [`@rome-protocol/sdk`](https://github.com/rome-protocol/rome-sdk-ts) (`submitRomeTxV1`)에서는 프록시가 EVM 호출을 위해 Solana v1 트랜잭션 하나를 구성합니다(최대 64개 계정과 4 KB, 주소 조회 테이블 없음; 코드에는 ComputeBudget instruction, treasure wallet 또는 account discovery가 없습니다). 지갑은 같은 키로 두 번 서명합니다: 먼저 읽을 수 있는 권한 부여 메시지(`Rome 승인` 한 줄에, `0x` 그리고 다음 줄에 EVM 트랜잭션 해시를 담습니다. 체인은 Ed25519 프로그램을 통해 이를 검증한 뒤 트랜잭션을 확인합니다. 앱은 서명된 트랜잭션을 Solana RPC로 전송하며, 호출은 EVM 트랜잭션 해시와 그 receipt를 반환합니다. 지갑이 트랜잭션에 서명하기 전에 SDK가 이를 검사합니다: payer만 서명자이고, Rome 프로그램과 Ed25519 검증기만 실행되며, Rome instruction은 사용자가 승인한 호출을 정확히 담고 있고, priority fee는 없습니다. 그 외의 것은 거부됩니다.

호출이 하나의 트랜잭션에 맞지 않으면, composer가 이를 거부하고 SDK가 같은 승인 서명으로 프록시에 넘겨 릴레이하게 하므로, 사용자는 여전히 한 번의 승인 프롬프트만 보게 됩니다. 그러면 결과에는 `route: "relay"`. 릴레이된 호출과 긴 호출에 대한 규칙은 다음에 있습니다 [릴레이된 호출 및 장시간 호출](/ko/developer-guides/call-evm-from-solana.md#relayed-calls-and-long-calls)릴레이된 호출은 체인의 네이티브 가스로 결제되므로, 합성 계정에는 가스 잔액이 필요합니다: `fundSyntheticGas(deps, amountWei)` 체인의 가스 토큰(Hadrian과 Rubicon의 USDC)을 지갑의 토큰 계정에서 그 안으로 옮기며, 지갑이 서명한 v1 트랜잭션 하나로 처리됩니다.

펀딩 단계(`buildFundLeg`)와 sweep 전에 지갑 토큰 계정을 만드는 것은 일반 Solana instruction입니다; `submitSolanaInstructionsV1` 도 v1 트랜잭션으로 전송하며, 동일한 지갑 서명자가 서명하고 프록시는 개입하지 않습니다. sweep 자체의 호출(`buildSweepLeg`, `HelperProgram.transfer_spl`는 다음을 거칩니다 `submitRomeTxV1` 다른 호출과 마찬가지로, 프록시가 토큰 계정을 찾아냅니다. `submitRomeTxV1` 는 자체적으로 새 합성 계정을 만들지 않습니다: 첫 번째 자금 이동 호출 전에 다음을 확인하세요 `isSyntheticProvisioned(...)` 그리고 false이면 다음을 제출하세요 `buildCreatePdaCall(synthetic)` 을 통해 `submitRomeTxV1` 한 번만. 코드가 포함된 전체 입금-출금 안내는 다음에 있습니다 [듀얼 레인 앱 빌드](/ko/developer-guides/dual-lane-app.md); 메커니즘은 다음에 있습니다 [Solana에서 EVM 호출](/ko/developer-guides/call-evm-from-solana.md). 이전의 `submitRomeTxSolanaLane`, 클라이언트에서 레거시 Solana 트랜잭션을 구성하며, 아직 SDK에 이전 경로로 남아 있습니다.

**각각이 어디서 `deps` 값이 오는지.** SDK의 `deps` 객체에는 필수 필드 다섯 개가 있습니다(그 외, 예를 들어 `fetchImpl` 와 타임아웃은 선택 사항입니다). 네 개는 체인에서 오고 하나는 지갑에서 옵니다:

| `deps` 필드    | 출처                                                                    | 레지스트리 getter(`@rome-protocol/registry` v0.2.0)                               |
| ------------ | --------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `proxyUrl`   | 체인의 RPC URL                                                           | `getChain(chainId).rpcUrl`                                                   |
| `chainId`    | 체인 ID                                                                 | `getChain(chainId).chainId`                                                  |
| `programId`  | 체인이 실행하는 Rome 프로그램 ID                                                 | `getChain(chainId).romeEvmProgramId`                                         |
| `connection` | 서명된 트랜잭션이 전송되는 체인 클러스터용 Solana RPC(devnet은 Hadrian, mainnet은 Rubicon) | `getChain(chainId).solana.rpc` (Hadrian의 공개 devnet URL); 메인넷에는 자체 RPC를 사용하세요 |
| `signer`     | 지갑의 `LaneSigner`, 또는 `Keypair` 스크립트에서                                 | 없음                                                                           |

leg 빌더는 다음에 없는 값을 받습니다 `deps`. 그 `mint` (이라고 부르는 `usdcMint` 안내에서는) 가스 토큰의 Solana 민트이며, 다음에서 가져옵니다 `getTokens(chainId)` (다음 항목과 함께 `kind: "gas"`, 필드 `mintId`). wUSDC 래퍼 주소는 leg 빌더 입력이 아닙니다; ERC-20 호출에 사용하며, 다음 항목입니다 `kind: "spl_wrapper"` 와 심볼 `wUSDC` (필드 `address`). 레지스트리는 Hadrian을 포괄합니다. Rubicon은 직접 채우세요: `proxyUrl` `https://rubicon.mainnet.romeprotocol.xyz/`, `chainId` `7531`, `programId` `RomePq9X3iAoTr813HR7uRarafFDUJty6GdiEceYpzX`, `mint` `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`, 다음 섹션의 표에 있는 래퍼, 그리고 다음에 대한 Solana 메인넷 RPC `connection`. [Rubicon](/ko/networks/rubicon.md) 에는 전체 목록이 있습니다.

**프록시의 외부 v1 엔드포인트 — SDK 없이 같은 경로.** SDK는 원자적 compose, 릴레이, 가스 예치(`fundSyntheticGas`). SDK를 사용하지 않는 클라이언트를 위해 원시 RPC 메서드는 그대로 남아 있으며, SDK가 감싸지 않는 반복적 compose도 포함됩니다. 지갑은 호출에 대해 하나의 Ed25519 메시지에 서명합니다(읽을 수 있는 형식 `Rome authorization\n0x<hash>` 또는 원시 해시)이고, 프록시는 지갑이 서명할 Solana 트랜잭션(들)을 구성하거나(`rome_composeUnsignedAtomicV1`, `rome_composeUnsignedIterativeV1` + `rome_submitSignedV1Plan`) 또는 지갑 서명 하나로 전체 실행을 직접 수행합니다(`rome_relayUnsignedV1`, 다음 후 `rome_composeExternalDepositV1` (SDK의 `fundSyntheticGas`)는 합성 계정의 가스 잔액에 자금을 공급합니다; 릴레이된 호출은 여기서 차감하므로, 잔액이 줄면 보충하세요). 메서드 형태는 [JSON-RPC 지원](/ko/reference/json-rpc.md); 승인 규칙은 다음에 있습니다 [Solana에서 EVM 호출](/ko/developer-guides/call-evm-from-solana.md#the-external-v1-endpoints). 반복적인 것은 무엇이든 릴레이를 사용하고, 맞는 것은 모두 SDK 경로를 사용하세요.

어느 경우든 계약은 합성 주소에서 온 일반 트랜잭션을 보게 되며, 사용자는 EVM 키를 보유하지 않습니다.

## 4. 네트워크별 래퍼 주소

| 네트워크             | `wUSDC` 래퍼                                   | 기타 래퍼                                                                                                    |
| ---------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| Rubicon (7531)   | `0x0952d233b0c254cd375f3bfb3e5869c1a906f9b3` | `wETH` `0x01e8b3573da1d4b7b4b1ce0932cf07c8af0c92e9`, `wSOL` `0xc4e29e0f726a906e93277cbbc37bf27a9848a113` |
| Hadrian (200010) | `0xbce339ba4c3a8de3bb8af1c5539e6ac11da3112d` | `wETH` `0x02aeace038269f9961c93d04dcacd6fb3adfa55f`, `wSOL` `0x39f36444fcb79b3e691544aee2a832ebef54ca9f` |

네이티브 가스 토큰은 다음으로 표시됩니다 `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` 토큰 목록에서; 이는 ERC-20 계약이 아닙니다. 래퍼는 SPL 민트의 소수 자릿수를 따르며 18이 아닙니다: wUSDC 6, wETH 8, wSOL 9.

## 5. 출시 체크리스트

1. Hadrian에 배포됨; EVM 경로는 MetaMask에서 작동합니다.
2. 가치를 이동하는 모든 엔트리포인트는 ERC-20 기반이며 체인의 표준 래퍼를 가리킵니다.
3. v1 트랜잭션에 서명하는 Solana 지갑(Solflare는 오늘 devnet에서 가능하고, Phantom은 아직 불가)은 Hadrian에서 전체 왕복을 완료합니다: 합성 계정 준비(`create_pda`, 한 번) → 펀딩 단계 → 승인 부여 → approve → 호출 → sweep 단계, SDK 경로 사용; 호출이 반복적이라면 릴레이 경로 사용.
4. 각 Solana 경로 호출의 `computeUnitsConsumed` 는 Solana receipt에서 읽히며 원자적 예산 아래에 있거나, 호출은 릴레이를 통해 라우팅됩니다.
5. 래퍼 승인(grant)은 두 경로 모두에서 앱의 첫 입금 흐름에 있습니다: `isEnabled(user)` 가 확인되고 `approve_spl` 가 false이면 한 번 전송됩니다([한 번만: 래퍼에 허가 부여](/ko/developer-guides/dual-lane-app.md#one-time-grant-the-wrapper)).
6. 소스가 익스플로러에서 검증되었습니다.
7. 메인넷 래퍼 주소로 Rubicon에 재배포했습니다. Rubicon은 레지스트리에 없으므로, 그 `deps` 값은 다음에서 수동으로 채웁니다 [Rubicon](/ko/networks/rubicon.md). 동일한 왕복을 실제 자금으로 한 번 실행하며, 메인넷에서 v1 트랜잭션 서명이 확인된 지갑을 사용합니다.

## 다음 단계

* [듀얼 레인 앱 빌드](/ko/developer-guides/dual-lane-app.md) — 볼트 예제, 단계별, 두 지갑 모두
* [Solana에서 EVM 호출](/ko/developer-guides/call-evm-from-solana.md) — 합성 주소, 계정 탐색, 외부 v1 엔드포인트
* [Solidity 컨트랙트 배포](/ko/developer-guides/deploy-solidity.md) · [컨트랙트 검증](/ko/developer-guides/verify-contracts.md) · [컨트랙트 주소](/ko/reference/contract-addresses.md)


---

# 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/ko/developer-guides/open-to-solana-users.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.
