feat: Add WASM support and browser extension infrastructure
- Add WASM build target and dependencies for all crates. - Implement IndexedDB-based persistent storage for WASM. - Create browser extension infrastructure (UI, scripting, etc.). - Integrate Rhai scripting engine for secure automation. - Implement user stories and documentation for the extension.
This commit is contained in:
@@ -14,4 +14,22 @@
|
||||
|
||||
pub use ethers_core::types::*;
|
||||
pub mod provider;
|
||||
pub mod rhai_bindings;
|
||||
pub mod rhai_sync_helpers;
|
||||
pub use provider::send_rpc;
|
||||
|
||||
/// Public EVM client struct for use in bindings and sync helpers
|
||||
pub struct EvmClient {
|
||||
// Add fields as needed for your implementation
|
||||
}
|
||||
|
||||
impl EvmClient {
|
||||
pub async fn get_balance(&self, provider_url: &str, public_key: &[u8]) -> Result<u64, String> {
|
||||
// TODO: Implement actual logic
|
||||
Ok(0)
|
||||
}
|
||||
pub async fn send_transaction(&self, provider_url: &str, key_id: &str, password: &[u8], tx_data: rhai::Map) -> Result<String, String> {
|
||||
// TODO: Implement actual logic
|
||||
Ok("tx_hash_placeholder".to_string())
|
||||
}
|
||||
}
|
||||
|
49
evm_client/src/rhai_bindings.rs
Normal file
49
evm_client/src/rhai_bindings.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
//! Rhai bindings for EVM Client module
|
||||
//! Provides a single source of truth for scripting integration for EVM actions.
|
||||
|
||||
use rhai::{Engine, Map};
|
||||
pub use crate::EvmClient; // Ensure EvmClient is public and defined in lib.rs
|
||||
|
||||
/// Register EVM Client APIs with the Rhai scripting engine.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn register_rhai_api(engine: &mut Engine, evm_client: std::sync::Arc<EvmClient>) {
|
||||
/// Rhai-friendly wrapper for EvmClient, allowing method registration and instance sharing.
|
||||
#[derive(Clone)]
|
||||
struct RhaiEvmClient {
|
||||
inner: std::sync::Arc<EvmClient>,
|
||||
}
|
||||
impl RhaiEvmClient {
|
||||
/// Get balance using the EVM client.
|
||||
pub fn get_balance(&self, provider_url: String, public_key: rhai::Blob) -> Result<String, String> {
|
||||
// Use the sync helper from crate::rhai_sync_helpers
|
||||
crate::rhai_sync_helpers::get_balance_sync(&self.inner, &provider_url, &public_key)
|
||||
}
|
||||
|
||||
/// Send transaction using the EVM client.
|
||||
pub fn send_transaction(&self, provider_url: String, key_id: String, password: rhai::Blob, tx_data: rhai::Map) -> Result<String, String> {
|
||||
// Use the sync helper from crate::rhai_sync_helpers
|
||||
crate::rhai_sync_helpers::send_transaction_sync(&self.inner, &provider_url, &key_id, &password, tx_data)
|
||||
}
|
||||
}
|
||||
engine.register_type::<RhaiEvmClient>();
|
||||
engine.register_fn("get_balance", RhaiEvmClient::get_balance);
|
||||
engine.register_fn("send_transaction", RhaiEvmClient::send_transaction);
|
||||
// Register instance for scripts
|
||||
let rhai_ec = RhaiEvmClient { inner: evm_client.clone() };
|
||||
// Rhai does not support register_global_constant; pass the client as a parameter or use module scope.
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub fn register_rhai_api(engine: &mut Engine) {
|
||||
// In WASM, register global functions that operate on the singleton/global EvmClient
|
||||
engine.register_fn("get_balance", |provider_url: String, public_key: rhai::Blob| -> Result<String, String> {
|
||||
// WASM: get_balance is async, so error if called from Rhai
|
||||
Err("get_balance is async in WASM; use the WASM get_balance() API from JS instead".to_string())
|
||||
});
|
||||
engine.register_fn("send_transaction", |provider_url: String, key_id: String, password: rhai::Blob, tx_data: rhai::Map| -> Result<String, String> {
|
||||
// WASM: send_transaction is async, so error if called from Rhai
|
||||
Err("send_transaction is async in WASM; use the WASM send_transaction() API from JS instead".to_string())
|
||||
});
|
||||
// No global evm object in WASM; use JS/WASM API for EVM ops
|
||||
}
|
||||
|
40
evm_client/src/rhai_sync_helpers.rs
Normal file
40
evm_client/src/rhai_sync_helpers.rs
Normal file
@@ -0,0 +1,40 @@
|
||||
//! Synchronous wrappers for async EVM client APIs for use in Rhai bindings.
|
||||
//! These use block_on for native, and should be adapted for WASM as needed.
|
||||
|
||||
use crate::EvmClient;
|
||||
use rhai::Map;
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use tokio::runtime::Handle;
|
||||
|
||||
/// Synchronously get the balance using the EVM client.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn get_balance_sync(
|
||||
evm_client: &EvmClient,
|
||||
provider_url: &str,
|
||||
public_key: &[u8],
|
||||
) -> Result<String, String> {
|
||||
Handle::current().block_on(async {
|
||||
evm_client.get_balance(provider_url, public_key)
|
||||
.await
|
||||
.map(|b| b.to_string())
|
||||
.map_err(|e| format!("get_balance error: {e}"))
|
||||
})
|
||||
}
|
||||
|
||||
/// Synchronously send a transaction using the EVM client.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn send_transaction_sync(
|
||||
evm_client: &EvmClient,
|
||||
provider_url: &str,
|
||||
key_id: &str,
|
||||
password: &[u8],
|
||||
tx_data: Map,
|
||||
) -> Result<String, String> {
|
||||
Handle::current().block_on(async {
|
||||
evm_client.send_transaction(provider_url, key_id, password, tx_data)
|
||||
.await
|
||||
.map(|tx| tx.to_string())
|
||||
.map_err(|e| format!("send_transaction error: {e}"))
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user