use crate::storage::{ChainDetails, DataKey};
use soroban_sdk::{contractclient, contracttype, Address, Bytes, BytesN, Env, Vec};
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub struct Signature {
pub signature: BytesN<64>,
pub public_key: BytesN<32>,
}
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub struct ProcessRequest {
pub tx_id: u128,
pub source_chain_id: u64,
pub destination_chain_id: u64,
pub sender: Bytes,
pub recipient: Address,
pub relayer: Address,
pub on_chain_data: Bytes,
pub off_chain_data: Bytes,
pub signatures: Vec<Signature>,
pub gas: u64,
}
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub struct SendRequest {
pub sender: Bytes,
pub recipient: Bytes,
pub destination_chain: u64,
pub chain_data: Bytes,
pub confirmations: u32,
}
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub struct InitializeUniversalSettingsRequest {
pub chain_signers: Vec<Address>,
pub chain_signers_required: u32,
pub via_signers: Vec<Address>,
pub via_signers_required: u32,
pub relayers: Vec<Address>,
pub relayers_required: bool,
pub system_enabled: bool,
pub pos_handler: Address,
pub fee_handler: Address,
pub gas_handler: Address,
}
#[contractclient(name = "MessageGatewayV4Client")]
pub trait MessageGatewayV4Interface {
fn __constructor(env: &Env, chain_id: u64, deployer: Address, message_prefix: u128);
fn only_owner(env: &Env);
fn set_chain_signers(env: &Env, chain_signers: Vec<Address>, required: u32);
fn set_via_signers(env: &Env, via_signers: Vec<Address>, required: u32);
fn set_relayers(env: &Env, relayers: Vec<Address>, required: bool);
fn set_system_enabled(env: &Env, system_enabled: bool);
fn is_system_enabled(env: &Env) -> bool;
fn initialize_universal_settings(env: &Env, request: InitializeUniversalSettingsRequest);
fn send(env: &Env, request: SendRequest) -> u128;
fn process(env: &Env, request: ProcessRequest);
fn set_contract_relayers(env: &Env, contract_relayers: Vec<Address>, contract: Address);
fn set_project_signers(
env: &Env,
project_signers: Vec<Address>,
required: u32,
project_contract: Address,
);
fn set_tip(env: &Env, block_number: u32);
fn get_tip(env: &Env) -> u32;
fn get_next_tx_id(env: &Env) -> u128;
fn is_relayer_authorized(env: &Env, recipient: Address, relayer: Address) -> bool;
fn update_simple_address_array(env: &Env, key: DataKey, new_array: Vec<Address>) -> u32;
fn update_nested_address_array(env: &Env, key: DataKey, new_array: Vec<Address>) -> u32;
fn get_all_chain_signers(env: &Env) -> (Vec<Address>, u32);
fn get_all_via_signers(env: &Env) -> (Vec<Address>, u32);
fn get_all_project_signers(env: &Env, contract: Address) -> (Vec<Address>, u32);
fn get_all_relayers(env: &Env) -> (Vec<Address>, bool);
fn get_all_contract_relayers(env: &Env, contract: Address) -> (Vec<Address>, bool);
fn set_pos_handler(env: &Env, pos_handler: Address);
fn set_fee_handler(env: &Env, fee_handler: Address);
fn set_gas_handler(env: &Env, gas_handler: Address);
fn get_chain_details(env: &Env) -> ChainDetails;
fn set_chain_details(env: &Env, chain_details: ChainDetails);
fn validate_security_layers(env: &Env, request: ProcessRequest);
fn process_call(env: &Env, request: ProcessRequest);
fn get_required_signer_counts(env: &Env, recipient: Address) -> (u32, u32, u32);
fn get_gas_handler(env: &Env) -> Option<Address>;
fn process_gas_refund(env: &Env, recipient: Address, relayer: Address, gas: u64);
}