/// Defines encodings of G1 and G2 elements for use in Solidity templates.
|
|
use ark_bn254::{Fq, G1Affine, G2Affine};
|
|
use std::fmt::{self, Display};
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct FqWrapper(pub Fq);
|
|
|
|
impl Display for FqWrapper {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct G1Repr(pub [FqWrapper; 2]);
|
|
|
|
impl Display for G1Repr {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{:#?}", self.0)
|
|
}
|
|
}
|
|
|
|
/// Converts a G1 element to a representation that can be used in Solidity templates.
|
|
pub fn g1_to_fq_repr(g1: G1Affine) -> G1Repr {
|
|
G1Repr([FqWrapper(g1.x), FqWrapper(g1.y)])
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct G2Repr(pub [[FqWrapper; 2]; 2]);
|
|
|
|
impl Display for G2Repr {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{:#?}", self.0)
|
|
}
|
|
}
|
|
|
|
/// Converts a G2 element to a representation that can be used in Solidity templates.
|
|
pub fn g2_to_fq_repr(g2: G2Affine) -> G2Repr {
|
|
G2Repr([
|
|
[FqWrapper(g2.x.c0), FqWrapper(g2.x.c1)],
|
|
[FqWrapper(g2.y.c0), FqWrapper(g2.y.c1)],
|
|
])
|
|
}
|