sov-sequencer-registry 0.3.0

A Sovereign SDK module for registering rollup sequencers
use jsonrpsee::core::RpcResult;
use sov_modules_api::default_context::DefaultContext;
use sov_modules_api::digest::Digest;
use sov_modules_api::{Address, Module, Spec, WorkingSet};
use sov_rollup_interface::mocks::{MockAddress, MockDaSpec};
use sov_sequencer_registry::{SequencerConfig, SequencerRegistry};

pub type C = DefaultContext;
pub type Da = MockDaSpec;

pub const GENESIS_SEQUENCER_KEY: &str = "sequencer_1";
pub const GENESIS_SEQUENCER_DA_ADDRESS: [u8; 32] = [1; 32];
pub const ANOTHER_SEQUENCER_KEY: &str = "sequencer_2";
#[allow(dead_code)]
pub const ANOTHER_SEQUENCER_DA_ADDRESS: [u8; 32] = [2; 32];
pub const UNKNOWN_SEQUENCER_KEY: &str = "sequencer_3";
#[allow(dead_code)]
pub const UNKNOWN_SEQUENCER_DA_ADDRESS: [u8; 32] = [3; 32];
pub const LOW_FUND_KEY: &str = "zero_funds";
pub const INITIAL_BALANCE: u64 = 210;
pub const LOCKED_AMOUNT: u64 = 200;

pub struct TestSequencer {
    pub bank: sov_bank::Bank<C>,
    pub bank_config: sov_bank::BankConfig<C>,

    pub registry: SequencerRegistry<C, Da>,
    pub sequencer_config: SequencerConfig<C, Da>,
}

impl TestSequencer {
    pub fn genesis(&mut self, working_set: &mut WorkingSet<C>) {
        self.bank.genesis(&self.bank_config, working_set).unwrap();

        self.registry
            .genesis(&self.sequencer_config, working_set)
            .unwrap();
    }

    #[allow(dead_code)]
    pub fn query_balance_via_bank(
        &mut self,
        working_set: &mut WorkingSet<C>,
    ) -> RpcResult<sov_bank::BalanceResponse> {
        self.bank.balance_of(
            self.sequencer_config.seq_rollup_address,
            self.sequencer_config.coins_to_lock.token_address,
            working_set,
        )
    }

    #[allow(dead_code)]
    pub fn query_balance(
        &mut self,
        user_address: <DefaultContext as Spec>::Address,
        working_set: &mut WorkingSet<C>,
    ) -> RpcResult<sov_bank::BalanceResponse> {
        self.bank.balance_of(
            user_address,
            self.sequencer_config.coins_to_lock.token_address,
            working_set,
        )
    }
}

pub fn create_bank_config() -> (sov_bank::BankConfig<C>, <C as Spec>::Address) {
    let seq_address = generate_address(GENESIS_SEQUENCER_KEY);

    let token_config = sov_bank::TokenConfig {
        token_name: "InitialToken".to_owned(),
        address_and_balances: vec![
            (seq_address, INITIAL_BALANCE),
            (generate_address(ANOTHER_SEQUENCER_KEY), INITIAL_BALANCE),
            (generate_address(UNKNOWN_SEQUENCER_KEY), INITIAL_BALANCE),
            (generate_address(LOW_FUND_KEY), 3),
        ],
        authorized_minters: vec![],
        salt: 8,
    };

    (
        sov_bank::BankConfig {
            tokens: vec![token_config],
        },
        seq_address,
    )
}

pub fn create_sequencer_config(
    seq_rollup_address: <C as Spec>::Address,
    token_address: <C as Spec>::Address,
) -> SequencerConfig<C, Da> {
    SequencerConfig {
        seq_rollup_address,
        seq_da_address: MockAddress::from(GENESIS_SEQUENCER_DA_ADDRESS),
        coins_to_lock: sov_bank::Coins {
            amount: LOCKED_AMOUNT,
            token_address,
        },
        is_preferred_sequencer: false,
    }
}

pub fn create_test_sequencer() -> TestSequencer {
    let bank = sov_bank::Bank::<C>::default();
    let (bank_config, seq_rollup_address) = create_bank_config();

    let token_address = sov_bank::get_genesis_token_address::<C>(
        &bank_config.tokens[0].token_name,
        bank_config.tokens[0].salt,
    );

    let registry = SequencerRegistry::<C, Da>::default();
    let sequencer_config = create_sequencer_config(seq_rollup_address, token_address);

    TestSequencer {
        bank,
        bank_config,
        registry,
        sequencer_config,
    }
}

pub fn generate_address(key: &str) -> <C as Spec>::Address {
    let hash: [u8; 32] = <C as Spec>::Hasher::digest(key.as_bytes()).into();
    Address::from(hash)
}