import { Address } from '@btc-vision/transaction';
import { CallResult } from '../../../../contracts/CallResult.js';
import { OPNetEvent } from '../../../../contracts/OPNetEvent.js';
import { IOP20SContract } from '../opnet/IOP20SContract.js';
export type OracleAddedEvent = {
    readonly oracle: Address;
    readonly addedBy: Address;
};
export type OracleRemovedEvent = {
    readonly oracle: Address;
    readonly removedBy: Address;
};
export type PriceSubmittedEvent = {
    readonly oracle: Address;
    readonly price: bigint;
    readonly blockNumber: bigint;
};
export type PriceAggregatedEvent = {
    readonly medianPrice: bigint;
    readonly oracleCount: number;
    readonly blockNumber: bigint;
};
export type MintedEventOracle = {
    readonly to: Address;
    readonly amount: bigint;
};
export type AddOracle = CallResult<{}, [OPNetEvent<OracleAddedEvent>]>;
export type RemoveOracle = CallResult<{}, [OPNetEvent<OracleRemovedEvent>]>;
export type SubmitPrice = CallResult<{}, [OPNetEvent<PriceSubmittedEvent>]>;
export type AggregatePrice = CallResult<{}, [OPNetEvent<PriceAggregatedEvent>]>;
export type MintOracle = CallResult<{}, [OPNetEvent<MintedEventOracle>]>;
export type OracleCount = CallResult<{
    count: bigint;
}, []>;
export type MinOracles = CallResult<{
    min: bigint;
}, []>;
export type IsOracleActive = CallResult<{
    active: boolean;
}, []>;
export type OracleSubmission = CallResult<{
    price: bigint;
}, []>;
export type AdminMultiOracleStable = CallResult<{
    admin: Address;
}, []>;
export interface IMultiOracleStablecoinContract extends IOP20SContract {
    addOracle(oracle: Address): Promise<AddOracle>;
    removeOracle(oracle: Address): Promise<RemoveOracle>;
    submitPrice(price: bigint): Promise<SubmitPrice>;
    aggregatePrice(oracles: Address[]): Promise<AggregatePrice>;
    mint(to: Address, amount: bigint): Promise<MintOracle>;
    oracleCount(): Promise<OracleCount>;
    minOracles(): Promise<MinOracles>;
    isOracleActive(oracle: Address): Promise<IsOracleActive>;
    oracleSubmission(oracle: Address): Promise<OracleSubmission>;
    admin(): Promise<AdminMultiOracleStable>;
}
