use halo2_proofs::{
circuit::{AssignedCell, Layouter},
plonk::Error,
};
use pasta_curves::pallas;
use orchard::constants::{OrchardFixedBases, OrchardFixedBasesFull};
use orchard::circuit::commit_ivk::CommitIvkChip;
use halo2_gadgets::ecc::{
chip::EccChip,
NonIdentityPoint, Point, ScalarFixed, ScalarVar,
};
use orchard::constants::{OrchardCommitDomains, OrchardHashDomains};
use halo2_gadgets::sinsemilla::chip::SinsemillaChip;
pub fn spend_auth_g_mul(
ecc_chip: EccChip<OrchardFixedBases>,
layouter: impl Layouter<pallas::Base>,
_label: &str,
scalar: ScalarFixed<pallas::Affine, EccChip<OrchardFixedBases>>,
) -> Result<Point<pallas::Affine, EccChip<OrchardFixedBases>>, Error> {
use halo2_gadgets::ecc::FixedPoint;
let spend_auth_g = OrchardFixedBasesFull::SpendAuthG;
let spend_auth_g = FixedPoint::from_inner(ecc_chip, spend_auth_g);
let (point, _) = spend_auth_g.mul(layouter, scalar)?;
Ok(point)
}
#[allow(clippy::type_complexity)]
pub fn prove_address_ownership(
sinsemilla_chip: SinsemillaChip<
OrchardHashDomains,
OrchardCommitDomains,
OrchardFixedBases,
>,
ecc_chip: EccChip<OrchardFixedBases>,
commit_ivk_chip: CommitIvkChip,
mut layouter: impl Layouter<pallas::Base>,
label: &str,
ak: AssignedCell<pallas::Base, pallas::Base>,
nk: AssignedCell<pallas::Base, pallas::Base>,
rivk: ScalarFixed<pallas::Affine, EccChip<OrchardFixedBases>>,
g_d: &NonIdentityPoint<pallas::Affine, EccChip<OrchardFixedBases>>,
pk_d_claimed: &NonIdentityPoint<pallas::Affine, EccChip<OrchardFixedBases>>,
) -> Result<AssignedCell<pallas::Base, pallas::Base>, Error> {
use orchard::circuit::commit_ivk::gadgets::commit_ivk;
let ivk = commit_ivk(
sinsemilla_chip,
ecc_chip.clone(),
commit_ivk_chip,
layouter.namespace(|| alloc::format!("{label} CommitIvk")),
ak,
nk,
rivk,
)?;
let ivk_cell = ivk.inner().clone();
let ivk_scalar = ScalarVar::from_base(
ecc_chip.clone(),
layouter.namespace(|| alloc::format!("{label} ivk as scalar")),
ivk.inner(),
)?;
let (derived_pk_d, _) = g_d.mul(
layouter.namespace(|| alloc::format!("{label} [ivk] g_d")),
ivk_scalar,
)?;
derived_pk_d.constrain_equal(
layouter.namespace(|| alloc::format!("{label} pk_d equality")),
pk_d_claimed,
)?;
Ok(ivk_cell)
}