use crate::{
dpc::Record,
objects::{AccountScheme, LedgerScheme, Transaction},
};
use rand::Rng;
pub trait DPCScheme<L: LedgerScheme> {
type Account: AccountScheme;
type Metadata: ?Sized;
type Payload;
type Parameters;
type PrivateProgramInput;
type Record: Record<Owner = <Self::Account as AccountScheme>::AccountAddress>;
type SystemParameters;
type Transaction: Transaction<SerialNumber = <Self::Record as Record>::SerialNumber>;
type LocalData;
type ExecuteContext;
fn setup<R: Rng>(ledger_parameters: &L::MerkleParameters, rng: &mut R) -> anyhow::Result<Self::Parameters>;
fn create_account<R: Rng>(parameters: &Self::Parameters, rng: &mut R) -> anyhow::Result<Self::Account>;
#[allow(clippy::too_many_arguments)]
fn execute_offline<R: Rng>(
parameters: Self::SystemParameters,
old_records: Vec<Self::Record>,
old_account_private_keys: Vec<<Self::Account as AccountScheme>::AccountPrivateKey>,
new_record_owners: Vec<<Self::Account as AccountScheme>::AccountAddress>,
new_is_dummy_flags: &[bool],
new_values: &[u64],
new_payloads: Vec<Self::Payload>,
new_birth_program_ids: Vec<Vec<u8>>,
new_death_program_ids: Vec<Vec<u8>>,
memorandum: <Self::Transaction as Transaction>::Memorandum,
network_id: u8,
rng: &mut R,
) -> anyhow::Result<Self::ExecuteContext>;
fn execute_online<R: Rng>(
parameters: &Self::Parameters,
execute_context: Self::ExecuteContext,
old_death_program_proofs: Vec<Self::PrivateProgramInput>,
new_birth_program_proofs: Vec<Self::PrivateProgramInput>,
ledger: &L,
rng: &mut R,
) -> anyhow::Result<(Vec<Self::Record>, Self::Transaction)>;
fn verify(parameters: &Self::Parameters, transaction: &Self::Transaction, ledger: &L) -> anyhow::Result<bool>;
fn verify_transactions(
parameters: &Self::Parameters,
block: &[Self::Transaction],
ledger: &L,
) -> anyhow::Result<bool>;
}