use alloy_consensus::{SignableTransaction, TxEip1559};
use alloy_primitives::{Bytes, TxKind};
use alloy_signer::SignerSync;
use alloy_signer_local::PrivateKeySigner;
use core_lane::{
create_bitcoin_rpc_client, execute_transaction,
Address, BundleStateManager, CoreLaneStateForLib,
StateManager, TxEnvelope, U256,
};
use bitcoin::Network;
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Setup Bitcoin RPC client
let bitcoin_client = create_bitcoin_rpc_client(
"http://127.0.0.1:18443",
"user",
"password"
)?;
// Initialize state and context
let mut state = StateManager::new();
let mut state_context = CoreLaneStateForLib::new(
state.clone(),
bitcoin_client.clone(),
bitcoin_client,
Network::Regtest
);
// Create a signer
let signer: PrivateKeySigner =
"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
.parse()?;
let sender = signer.address();
let recipient = Address::from([0x99; 20]);
// Give sender initial balance
let mut setup_bundle = BundleStateManager::new();
let initial_balance = U256::from(10_000_000_000_000_000_000u128);
setup_bundle.add_balance(&state, sender, initial_balance)?;
state.apply_changes(setup_bundle);
state_context.replace_state_manager(state.clone());
// Build transaction
let tx = TxEip1559 {
chain_id: 1,
nonce: 0,
max_priority_fee_per_gas: 1_000_000_000,
max_fee_per_gas: 20_000_000_000,
gas_limit: 21000,
to: TxKind::Call(recipient),
value: U256::from(1_000_000_000_000_000_000u128), // 1 ETH
input: Bytes::new(),
access_list: Default::default(),
};
// Sign transaction
let signature = signer.sign_hash_sync(&tx.signature_hash())?;
let signed = tx.into_signed(signature);
let envelope = TxEnvelope::Eip1559(signed);
// Execute transaction
let mut tx_bundle = BundleStateManager::new();
let block_timestamp = 1704067200;
let result = execute_transaction(
&envelope,
sender,
&mut tx_bundle,
&mut state_context,
block_timestamp
)?;
if result.success {
println!("✅ Transaction executed successfully!");
println!("Gas used: {}", result.gas_used);
// Apply changes
state.apply_changes(tx_bundle);
println!("Sender balance: {}", state.get_balance(sender));
println!("Recipient balance: {}", state.get_balance(recipient));
} else {
println!("❌ Transaction failed: {:?}", result.error);
}
Ok(())
}