@ocap/types
Version:
Typescript definitions generated from protobuf
200 lines (169 loc) • 5.84 kB
text/typescript
// core/types/interfaces/statedb.ts
import type { EventEmitter } from 'node:events';
import type { TTransactionReceipt } from '../lib/type_pb';
import type { Promisable } from './base';
import type {
IAccountState,
IAssetFactoryState,
IAssetState,
IDelegateState,
IEvidenceState,
IRollupBlock,
IRollupState,
IStakeState,
IStateContext,
ITokenFactoryState,
ITokenState,
} from './state';
/** Hook function type - args can be any type depending on hook trigger */
export type HookFunction = (...args: unknown[]) => void;
/** Operation context - index signature allows for protocol-specific context data */
export interface IOperationContext {
[key: string]: unknown;
}
/** Chain token configuration stored in chain state */
export interface IChainTokenInfo {
symbol?: string;
decimal?: number;
name?: string;
description?: string;
unit?: string;
totalSupply?: string;
initialSupply?: string;
address?: string;
foreignToken?: { contractAddress?: string; chainId?: number } | null;
}
export interface IChainState {
address: string;
chainId: string;
version?: string;
accounts?: Array<{ address: string; pk?: string; balance?: number; moniker?: string }>;
moderator?: { address: string; pk?: string };
token?: IChainTokenInfo;
transaction?: Record<string, unknown>;
vaults?: { txGas?: string[]; txFee?: string[] };
context?: IStateContext;
}
/** Transaction data stored in tx state */
export interface ITxData {
chainId?: string;
delegator?: string;
from?: string;
nonce?: number;
serviceFee?: string;
gasFee?: string;
gasPaid?: string;
pk?: string;
signature?: string;
signatures?: Array<{ signer?: string; delegator?: string; pk?: string; signature?: string }>;
itx?: { __typename?: string; typeUrl?: string };
itxJson?: Record<string, unknown>;
/** Extra transaction data - format varies by transaction source */
extra?: unknown;
}
export interface ITxState {
hash: string;
code?: string;
height?: number;
index?: number;
receipts?: TTransactionReceipt[];
receiptsVerified?: boolean;
receiver?: string;
sender?: string;
time?: string;
tx?: ITxData;
type?: string;
finalized?: boolean;
valid?: boolean;
}
export interface IBalanceState {
address: string;
tokenAddress: string;
balance: string;
context?: IStateContext;
}
export type StateEventHandler<T> = (state: T, ctx?: IOperationContext) => void | Promise<void>;
export interface IStateTable<T = unknown> {
name: string;
primaryKey: string;
uniqIndex?: string | string[];
create(id: string, attrs: Partial<T>, context?: IOperationContext): Promisable<T>;
get(id: string, context?: IOperationContext): Promisable<T | null>;
update(id: string, updates: Partial<T>, context?: IOperationContext): Promisable<T>;
updateOrCreate(exist: T | null, state: Partial<T>, context?: IOperationContext): Promisable<T>;
history(id: string, context?: IOperationContext): Promisable<T[]>;
reset(context?: IOperationContext): Promisable<void>;
pre(name: string, fn: HookFunction): void;
post(name: string, fn: HookFunction): void;
on(event: 'create' | 'update', handler: StateEventHandler<T>): void;
emit(event: 'create' | 'update', state: T, ctx?: IOperationContext): void;
generatePrimaryKey(doc: string | Record<string, unknown>): string;
updateCache(data: Record<string, unknown>, context: IOperationContext | null | undefined): void;
getCache(key: string | Record<string, unknown>, context: IOperationContext): T | null;
markReady(): void;
onReady(cb: () => void): void;
}
export interface IBalanceTable extends IStateTable<IBalanceState> {
getBalance(address: string, context?: IOperationContext): Promisable<Record<string, string>>;
updateBalance(
params: { address: string; tokens: Record<string, string>; context?: IOperationContext },
context?: IOperationContext
): Promisable<Record<string, string>>;
}
export interface ITokenTable extends IStateTable<ITokenState> {
existBySymbol(symbol: string, context?: IOperationContext): Promisable<boolean>;
}
export interface IRollupTable extends IStateTable<IRollupState> {
existByToken(token: string, context?: IOperationContext): Promisable<boolean>;
}
export interface IReady extends EventEmitter {
ready: boolean;
readyCallbacks: Array<() => void>;
readyMarks: Record<string, boolean>;
markReady(mark?: string): void;
onReady(cb: () => void): void;
}
/** Table names available in IStateDB */
export type StateDBTableName =
| 'chain'
| 'account'
| 'asset'
| 'token'
| 'tx'
| 'factory'
| 'tokenFactory'
| 'stake'
| 'delegation'
| 'rollup'
| 'rollupBlock'
| 'evidence'
| 'balance';
export interface IStateDB extends IReady {
name: string;
version?: string;
tables: readonly string[];
readyListenersAttached: boolean;
attachReadyListeners(): void;
chain: IStateTable<IChainState>;
account: IStateTable<IAccountState>;
asset: IStateTable<IAssetState>;
token: ITokenTable;
tx: IStateTable<ITxState>;
factory: IStateTable<IAssetFactoryState>;
tokenFactory: IStateTable<ITokenFactoryState>;
stake: IStateTable<IStakeState>;
delegation: IStateTable<IDelegateState>;
rollup: IRollupTable;
rollupBlock: IStateTable<IRollupBlock>;
evidence: IStateTable<IEvidenceState>;
balance: IBalanceTable;
/** Run function within a database transaction - txn type depends on StateDB implementation (dolt, fs, memory) */
runAsLambda?<T>(fn: (txn: unknown) => T | Promise<T>, options?: Record<string, unknown>): Promise<T>;
/** Get table by name - use this for dynamic table access */
getTable?(name: StateDBTableName): IStateTable<unknown>;
/**
* Close the database connection and release all resources.
* Must be called during graceful shutdown.
*/
close(): Promise<void>;
}