use boojum::gadgets::curves::sw_projective::SWProjectivePoint;
use boojum::gadgets::non_native_field::implementations::{
NonNativeFieldOverU16, NonNativeFieldOverU16Params,
};
use boojum::gadgets::tower_extension::algebraic_torus::TorusWrapper;
use boojum::gadgets::tower_extension::params::bn256::{
BN256Extension12Params, BN256Extension2Params, BN256Extension6Params,
};
use boojum::gadgets::tower_extension::{
fq12::Fq12 as NonNativeFq12, fq2::Fq2 as NonNativeFq2, fq6::Fq6 as NonNativeFq6,
};
pub use boojum::pairing::bn256::fq::Fq as BN256Fq;
pub use boojum::pairing::bn256::fr::Fr as BN256Fr;
pub use boojum::pairing::bn256::G1Affine as BN256Affine;
pub use boojum::pairing::bn256::G2Affine as BN256AffineTwisted;
pub mod ec_add;
pub mod ec_mul;
pub mod ec_pairing;
pub mod fixed_base_mul_table;
#[cfg(test)]
pub mod tests;
pub mod utils;
mod validation;
pub type BN256BaseNNFieldParams = NonNativeFieldOverU16Params<BN256Fq, 17>;
pub type BN256ScalarNNFieldParams = NonNativeFieldOverU16Params<BN256Fr, 17>;
pub type BN256BaseNNField<F> = NonNativeFieldOverU16<F, BN256Fq, 17>;
pub type BN256ScalarNNField<F> = NonNativeFieldOverU16<F, BN256Fr, 17>;
pub type BN256Fq2NNField<F> = NonNativeFq2<F, BN256Fq, BN256BaseNNField<F>, BN256Extension2Params>;
pub type BN256Fq6NNField<F> = NonNativeFq6<F, BN256Fq, BN256BaseNNField<F>, BN256Extension6Params>;
pub type BN256Fq12NNField<F> =
NonNativeFq12<F, BN256Fq, BN256BaseNNField<F>, BN256Extension12Params>;
pub type BN256TorusWrapper<F> =
TorusWrapper<F, BN256Fq, BN256BaseNNField<F>, BN256Extension12Params>;
pub type BN256SWProjectivePoint<F> = SWProjectivePoint<F, BN256Affine, BN256BaseNNField<F>>;
pub fn bn254_base_field_params() -> BN256BaseNNFieldParams {
NonNativeFieldOverU16Params::create()
}
pub fn bn254_scalar_field_params() -> BN256ScalarNNFieldParams {
NonNativeFieldOverU16Params::create()
}