Run Rhea Example

How to run the Rhea transaction example, including helper methods and expected output.

Rhea transaction encapsulates a single EVM L2 transaction within a Solana transaction.

This functionality enables fair sequencing of rollup transactions.

Fund Necessary Wallets

Ensure the from address (0xae600d1f94680ef43ab12f8d618f8aafc208fe25) has sufficient funds on Rome Devnet Esquiline (Chain ID 121212).

Otherwise, use the instructions linked here to fund this wallet.

Run Rhea Example

RUST_LOG=info cargo run --example rhea

Example Output

INFO rhea: https://explorer.solana.com/tx/5xpKQjx3f9Qv25h3Sx88fekSCiH1hRywKbDm8EMTqvY8AVPv5xUg9TXBrkUc4P3uvJohbvSCiERCP5J4edUwgzKY?cluster=devnet

The results show an EVM L2 transaction encapsulated within a single Solana transaction.

Solana Transaction

The Solana Devnet block explorer shows the Rhea Solana transaction below.

Instruction #3 logs show balance transfer from wallet ae600d1f94680ef43ab12f8d618f8aafc208fe25 to wallet b94f5374fce5edbc8e2a8697c15331677e6ebf0b.

L2 Transaction

Rome Esquiline block explorer shows the corresponding L2 transaction below between the same wallets from ae600d1f94680ef43ab12f8d618f8aafc208fe25 to b94f5374fce5edbc8e2a8697c15331677e6ebf0b.

Explanation of Methods Used

We explain the methods used in rome-sdk/examples/rhea.rs below.

Main Methods

The Rome struct will be used to compose transactions. Initialize it with your configuration:

let config = RomeConfig::load_json(common::CONFIG_PATH.parse()?).await?;
let rome = Rome::new_with_config(config).await?;

Create a RheaTx transaction and then compose it using the Rome transaction structure:

let rhea_tx = RheaTx::new(tx);
let mut rome_tx = rome.compose_rollup_tx(rhea_tx).await?;

Send the transaction to the Solana network:

let signature = rome.send_and_confirm(&mut *rome_tx).await?;

Helper Methods

To enable tracing and logging for easier debugging, initialize a tracing subscriber using:

tracing_subscriber::fmt::init();

Log relevant information using:

tracing::info!("Signature: {:?}", signature);
tracing::info!(
    "https://explorer.solana.com/tx/{}?cluster={}",
    signature,
    rpc_url
);

Create Ethereum wallet using:

let wallet = common::create_wallet();

Construct a transfer transaction using:

let tx: EthSignedTxTuple = common::construct_transfer_tx(&rome, &wallet, CHAIN_ID).await?;

The steps involved in transaction construction are:

  • Retrieve to and from addresses

  • Obtain the nonce

  • Create a transaction request (using ethers library)

  • Estimate gas fees

  • Sign the transaction

Last updated

Was this helpful?