import type { Address } from 'abitype';
import type { KeyAuthorization } from 'ox/tempo';
import * as Selectors from './Selectors.js';
export type Selector = NonNullable<KeyAuthorization.Scope['selector']>;
export type Options = {
    /** Recipient allowlist for selectors that support recipient restrictions. */
    recipients?: readonly Address[] | undefined;
};
export type Scope<address extends Address = Address, selector extends Selector | undefined = Selector | undefined> = Omit<KeyAuthorization.Scope, 'address' | 'recipients' | 'selector'> & {
    address: address;
    recipients?: readonly Address[] | undefined;
    selector?: selector | undefined;
};
export type Target<address extends Address = Address> = {
    /** Allows any selector on the target. */
    any: () => Scope<address, undefined>;
    /** Allows calls matching the selector on the target. */
    selector: <selector extends Selector>(selector: selector, options?: Options | undefined) => Scope<address, selector>;
};
export type SelectorMap = Record<string, Selector | Record<string, Selector>>;
export type Contract<address extends Address = Address, selectors extends SelectorMap = SelectorMap> = Target<address> & {
    readonly [name in keyof selectors]: selectors[name] extends Selector ? (options?: Options | undefined) => Scope<address, selectors[name]> : selectors[name] extends Record<string, Selector> ? OverloadedSelector<address, selectors[name]> : never;
};
export type OverloadedSelector<address extends Address = Address, selectors extends Record<string, Selector> = Record<string, Selector>> = {
    readonly [signature in keyof selectors]: (options?: Options | undefined) => Scope<address, selectors[signature]>;
} & {
    selector: <signature extends keyof selectors>(signature: signature, options?: Options | undefined) => Scope<address, selectors[signature]>;
};
export type Tip20<address extends Address = Address> = Contract<address, typeof Selectors.tip20>;
/**
 * Creates a call scope builder for an arbitrary target.
 *
 * @experimental
 */
export declare function target<address extends Address>(address: address): Target<address>;
/**
 * Creates a typed call scope builder from a selector map.
 *
 * @experimental
 */
export declare function contract<address extends Address, selectors extends SelectorMap>(address: address, selectors: selectors): Contract<address, selectors>;
/**
 * Creates a call scope builder for a TIP-20 token.
 *
 * @experimental
 */
export declare function tip20<address extends Address>(address: address): Tip20<address>;
//# sourceMappingURL=Scopes.d.ts.map