import { BytesLike, ethers } from 'ethers';
import { ERC721TimeLock as ERC721TimeLockContract } from './typechain/contracts/ERC721TimeLock.js';
import { MerkleTree } from './merkle-tree.js';
import { UserCommitmentHex } from './commitment-types.js';
import { Logger } from 'minauth/dist/plugin/logger.js';
import { ERC721Mock } from './typechain/index.js';
export interface IErc721TimeLock {
    fetchEligibleCommitments(): Promise<{
        commitments: UserCommitmentHex[];
    }>;
    buildCommitmentTree(): Promise<MerkleTree>;
    lockToken(tokenId: number, hash: UserCommitmentHex): Promise<void>;
    unlockToken(index: number): Promise<void>;
    get lockContractAddress(): string;
    get erc721ContractAddress(): string;
    get ethereumProvider(): ethers.BrowserProvider | ethers.JsonRpcProvider;
}
export declare class Erc721TimeLock implements IErc721TimeLock {
    private readonly signer;
    readonly lockContractAddress: string;
    readonly erc721ContractAddress: string;
    readonly ethereumProvider: ethers.BrowserProvider | ethers.JsonRpcProvider;
    private readonly logger?;
    protected contract: ERC721TimeLockContract;
    protected nftContract: ERC721Mock;
    constructor(signer: ethers.JsonRpcSigner, lockContractAddress: string, erc721ContractAddress: string, ethereumProvider: ethers.BrowserProvider | ethers.JsonRpcProvider, logger?: Logger | undefined);
    static initialize(addresses: {
        lockContractAddress: string;
        nftContractAddress: string;
    }, ethereumProvider: ethers.BrowserProvider | ethers.JsonRpcProvider, logger?: Logger): Promise<Erc721TimeLock>;
    /**
     * Fetch the TokenLocked and TokenUnlocked events to get the hashes of currently locked tokens.
     */
    fetchEligibleCommitments(): Promise<{
        commitments: UserCommitmentHex[];
    }>;
    /**
     * Locks a token by first approving its transfer and then interacting with the lock contract.
     * @param tokenId The ID of the token to be locked.
     * @param hash The hash representing the token's commitment.
     */
    lockToken(tokenId: number, { commitmentHex }: UserCommitmentHex): Promise<void>;
    /**
     * Unlocks a token by interacting with the lock contract.
     * @param index The index of the token in the locked tokens array.
     */
    unlockToken(index: number): Promise<void>;
    /**
     * Fetch the commitments from the events and build a merkle tree.
     */
    buildCommitmentTree: () => Promise<MerkleTree>;
}
export declare function hexlify(bytes: BytesLike): string;
export declare function hexToUInt8Array(hexString: string, size?: number): Uint8Array;
