Crate bevy_dojo

Source
Expand description

§Bevy Dojo: A Bevy plugin for Starknet integration

bevy_dojo provides a plugin for integrating Starknet blockchain functionality with the Bevy game engine. It enables executing Starknet transactions from Bevy systems in a non-blocking way, making it ideal for games that want to interact with smart contracts on Starknet.

§Features

  • Non-blocking Starknet connection management
  • Transaction execution with automatic status monitoring
  • Environment variable or explicit configuration options
  • Seamless integration with Bevy’s ECS

§Setup

Add the plugin to your Bevy app:

use bevy::prelude::*;
use bevy_dojo::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(BevyDojoPlugin)
        .add_systems(Update, keyboard_control)
        .run();
}

§Environment Variables

The plugin uses the following environment variables by default:

  • STARKNET_RPC_URL: URL of your Starknet RPC provider
  • STARKNET_ACCOUNT_ADDRESS: Your Starknet account address (as a hex string)
  • STARKNET_PRIVATE_KEY: Your private key (as a hex string)

Alternatively, you can provide these values explicitly by replacing the DefaultStarknetConfig resource.

§Example: Keyboard-controlled Connection and Transactions

use bevy::prelude::*;
use bevy_dojo::prelude::*;
use starknet::core::types::{Call, Felt};
use std::str::FromStr;

fn keyboard_control(
    keys: Res<Input<KeyCode>>,
    runtime: Res<TokioRuntime>,
    config: Res<DefaultStarknetConfig>,
    mut sn: ResMut<StarknetConnection>,
) {
    // Connect to Starknet when the user presses C
    if keys.just_pressed(KeyCode::C) {
        init_starknet_connection(runtime, config, sn);
    }

    // Execute a transaction when the user presses T
    if keys.just_pressed(KeyCode::T) {
        let calls = vec![
            Call {
                to: Felt::from_str("0x123456...").unwrap(),  // Contract address
                selector: Felt::from_str("0x987654...").unwrap(),  // Function selector
                calldata: vec![],  // Function arguments
            },
        ];

        execute_transaction(runtime, sn, calls);
    }
}

§Connection Status

You can check the connection status by examining the StarknetConnection resource:

fn display_connection_status(sn: Res<StarknetConnection>) {
    if sn.is_connected() {
        println!("Connected to Starknet");
    } else if sn.is_connecting() {
        println!("Connecting to Starknet...");
    } else {
        println!("Not connected to Starknet");
    }
}

Modules§

prelude
starknet
tokio

Structs§

BevyDojoPlugin
Starknet integration plugin with default configuration