/// <reference types="node" />
import { BigNumber, BigNumberish } from 'ethers';

declare type EddsaPrivateKey = Buffer;
declare type EddsaPublicKey = [BigNumber, BigNumber];
declare type EddsaSignature = [BigNumber, BigNumber, BigNumber];
declare class EddsaAccount {
    private eddsa;
    private babyJub;
    private pubKey;
    private privKey;
    constructor(pubKey: EddsaPublicKey, privKey: EddsaPrivateKey, eddsa: any, babyjub: any);
    static generateFromSeed(seed: BigNumberish): Promise<EddsaAccount>;
    sign(msg: BigNumberish): EddsaSignature;
    static verify(msg: BigNumberish, signature: [BigNumberish, BigNumberish, BigNumberish], pubKey: [BigNumberish, BigNumberish]): Promise<boolean>;
    getPubKey(): EddsaPublicKey;
}

interface FiniteField {
    one: bigint;
    zero: bigint;
    mul(a: bigint, b: bigint): bigint;
    sub(a: bigint, b: bigint): bigint;
    div(a: bigint, b: bigint): bigint;
    add(a: bigint, b: bigint): bigint;
    eq(a: bigint, b: bigint): boolean;
    e(a: BigNumberish): bigint;
    isZero(a: bigint): boolean;
    square(a: bigint): bigint;
    toObject(a: BigNumberish): BigNumberish;
    toRprLE(a: Uint8Array, size: number, msg: any): any;
}

declare type Poseidon = (inputs: any[]) => BigNumber;
declare function buildPoseidon(): Promise<(inputs: BigNumberish[]) => BigNumber>;
declare function getPoseidonFiniteField(): Promise<FiniteField>;

declare const SNARK_FIELD: BigNumber;

declare type Keccak256 = (inputs: any[]) => BigNumber;
declare function keccak256(inputs: any[]): BigNumber;

export { EddsaAccount, EddsaPrivateKey, EddsaPublicKey, EddsaSignature, Keccak256, Poseidon, SNARK_FIELD, buildPoseidon, getPoseidonFiniteField, keccak256 };
