From 33b068ec7b980665a1c323deb8bc4eafda72b151 Mon Sep 17 00:00:00 2001 From: Abdulmujib Oladayo Date: Sun, 26 Apr 2026 18:59:18 +0100 Subject: [PATCH 1/2] feat: add cross-chain bridge contract with secure locking and oracle verification --- swaptrade-contracts/counter/src/bridge.rs | 110 ++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 swaptrade-contracts/counter/src/bridge.rs diff --git a/swaptrade-contracts/counter/src/bridge.rs b/swaptrade-contracts/counter/src/bridge.rs new file mode 100644 index 0000000..5acf858 --- /dev/null +++ b/swaptrade-contracts/counter/src/bridge.rs @@ -0,0 +1,110 @@ +use soroban_sdk::{contracttype, Address, Env, Symbol}; + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub enum BridgeStatus { + Pending, + Locked, + Released, + Failed, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct BridgeRequest { + pub id: u64, + pub sender: Address, + pub recipient: Address, + pub amount: i128, + pub source_chain: Symbol, + pub dest_chain: Symbol, + pub status: BridgeStatus, +} + +const BRIDGE_COUNTER_KEY: &str = "bridge_counter"; +const BRIDGE_REQUEST_PREFIX: &str = "bridge_req"; + +pub fn initiate_bridge( + env: &Env, + sender: Address, + recipient: Address, + amount: i128, + source_chain: Symbol, + dest_chain: Symbol, +) -> u64 { + sender.require_auth(); + + assert!(amount > 0, "Amount must be positive"); + + let id: u64 = env + .storage() + .instance() + .get(&soroban_sdk::symbol_short!("brcnt")) + .unwrap_or(0u64) + + 1; + + env.storage() + .instance() + .set(&soroban_sdk::symbol_short!("brcnt"), &id); + + let request = BridgeRequest { + id, + sender, + recipient, + amount, + source_chain, + dest_chain, + status: BridgeStatus::Locked, + }; + + let key = (soroban_sdk::symbol_short!("brreq"), id); + env.storage().persistent().set(&key, &request); + + id +} + +pub fn confirm_bridge(env: &Env, oracle: Address, request_id: u64) { + oracle.require_auth(); + + let key = (soroban_sdk::symbol_short!("brreq"), request_id); + let mut request: BridgeRequest = env + .storage() + .persistent() + .get(&key) + .expect("Bridge request not found"); + + assert!( + request.status == BridgeStatus::Locked, + "Request is not in Locked state" + ); + + request.status = BridgeStatus::Released; + env.storage().persistent().set(&key, &request); +} + +pub fn fail_bridge(env: &Env, oracle: Address, request_id: u64) { + oracle.require_auth(); + + let key = (soroban_sdk::symbol_short!("brreq"), request_id); + let mut request: BridgeRequest = env + .storage() + .persistent() + .get(&key) + .expect("Bridge request not found"); + + assert!( + request.status == BridgeStatus::Locked, + "Request is not in Locked state" + ); + + request.status = BridgeStatus::Failed; + env.storage().persistent().set(&key, &request); +} + +pub fn get_bridge_request(env: &Env, request_id: u64) -> BridgeRequest { + let key = (soroban_sdk::symbol_short!("brreq"), request_id); + env.storage() + .persistent() + .get(&key) + .expect("Bridge request not found") +} \ No newline at end of file From 5024fff4a64107d2bc6457993e9ffc5c16ebda43 Mon Sep 17 00:00:00 2001 From: Abdulmujib Oladayo Date: Sun, 26 Apr 2026 19:01:52 +0100 Subject: [PATCH 2/2] feat: register bridge module in lib.rs --- swaptrade-contracts/counter/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/swaptrade-contracts/counter/src/lib.rs b/swaptrade-contracts/counter/src/lib.rs index 746cbc3..d298a42 100644 --- a/swaptrade-contracts/counter/src/lib.rs +++ b/swaptrade-contracts/counter/src/lib.rs @@ -5,6 +5,7 @@ use soroban_sdk::{ // Bring in modules from parent directory mod admin; +mod bridge; #[cfg(test)] mod alert_tests; mod alerts;