export type BuildRole = "owner" | "editor" | "viewer"; export interface PlotPermissionConfig { plotId: string; ownerId: string; guildId?: string; roles?: Readonly>; guildRole?: BuildRole; } export interface PlotPermissionSnapshot { plotId: string; ownerId: string; guildId?: string; roles: Readonly>; guildRole?: BuildRole; } export interface BuildActor { userId: string; guildId?: string; } export interface PlotPermissions { roleOf(actor: BuildActor): BuildRole | null; canEdit(actor: BuildActor): boolean; canView(actor: BuildActor): boolean; grant(userId: string, role: BuildRole): void; revoke(userId: string): void; setGuild(guildId: string | null, role?: BuildRole): void; transferOwner(userId: string): void; snapshot(): PlotPermissionSnapshot; } export declare function createPlotPermissions(config: PlotPermissionConfig): PlotPermissions; export type ContributionGoal = Readonly>; export interface ContributionResult { accepted: number; overflow: number; complete: boolean; } export interface ContributionPool { contribute(userId: string, resource: string, amount: number): ContributionResult; totals(): Readonly>; remaining(): Readonly>; byContributor(userId: string): Readonly>; progress(): number; isComplete(): boolean; snapshot(): Record>; restore(snapshot: Record>): void; } export declare function createContributionPool(goal: ContributionGoal): ContributionPool;