import { Vote, VoteStaple } from '../vote'; import type { Block } from '../block'; import { BlockHash } from '../block'; import type { VoteBlockHash, VoteBlockHashMap } from '../vote'; import type { GenericAccount, IdentifierAddress, TokenAddress } from '../account'; import Account, { AccountKeyAlgorithm } from '../account'; import type { Ledger, LedgerConfig, LedgerStorageAPI, LedgerSelector, PaginatedVotes, GetVotesAfterOptions, LedgerStorageTransactionBaseOptions, ListACLsByEntityFilters } from '../ledger'; import { IdempotentKey, LedgerStorageTransactionBase } from '../ledger'; import type { ACLRow, GetAllBalancesResponse, LedgerStatistics, CertificateWithIntermediates, AccountInfoForType } from './types'; import type { KVStorageProviderAPI } from '../kv'; import { LedgerStorageBase } from './common'; import type { Database as GoogleSpannerDatabase } from '@google-cloud/spanner'; import type { TableColumn, FilteredResponseRow, IndexName, TableName, QueryRow as HelperQueryRow, QueryRows } from './db_spanner_helper'; import type { ComputedEffectOfBlocks } from './effects'; import type { CertificateHash } from '../utils/certificate'; type QueryRow = HelperQueryRow | QueryRows; type ReadOptions = { limit?: number; skipLocalRead?: boolean; all?: boolean; range?: boolean; }; interface ReadQueryWithOptions extends ReadOptions { query: QueryRow; } type ReadRequest = QueryRow | ReadQueryWithOptions; type SpannerReadResponse[]> = { count: number; rows: FilteredResponseRow[]; moment: Date; }; interface SpannerTransactionOptions { strongRead?: boolean; } export declare class SpannerTransaction extends LedgerStorageTransactionBase { #private; readonly options: SpannerTransactionOptions; constructor(database: GoogleSpannerDatabase, options: SpannerTransactionOptions, transactionBase: LedgerStorageTransactionBaseOptions); evaluateError(error: any): any; beginTransaction(identifier: string, strongRead?: boolean): Promise; endTransaction(mode: 'COMMIT' | 'ROLLBACK'): Promise; insert>(table: T, query: R): void; upsert>(table: T, query: R): void; delete>(table: T, query: R): void; read[], X extends ReadRequest>(table: T, index: I, columns: C, request: X): Promise>; } /** * Ledger Configuration for Google Spanner */ export type SpannerConfig = { projectId: string; instanceId: string; databaseId: string; kv: KVStorageProviderAPI; strongRead?: boolean; }; /** * Ledger Storage for Google Spanner */ export declare class DBSpanner extends LedgerStorageBase implements LedgerStorageAPI { #private; constructor(); init(config: LedgerConfig, ledger: Ledger): void; destroy(): Promise; beginTransaction(transactionBase: LedgerStorageTransactionBaseOptions): Promise; commitTransaction(transaction: SpannerTransaction): Promise; abortTransaction(transaction: SpannerTransaction): Promise; evaluateError(error: any): Promise; delegatedWeight(transaction: SpannerTransaction, rep?: Account | InstanceType): Promise; getBalance(transaction: SpannerTransaction, account: GenericAccount | string, token: TokenAddress | string): Promise; getAllBalances(transaction: SpannerTransaction, account: GenericAccount): Promise; addPendingVote(transaction: SpannerTransaction, votesAndBlocks: VoteStaple): Promise; getAccountRep(transaction: SpannerTransaction, userAccount: GenericAccount | string): Promise; /** * If an adjustment cannot be made right now, defer it for follow-up */ protected adjustDefer(transaction: SpannerTransaction, input: VoteStaple): Promise; adjust(transaction: SpannerTransaction, input: VoteStaple, changes: ComputedEffectOfBlocks, mayDefer?: boolean, completedStaples?: Set): Promise; getBlock(transaction: SpannerTransaction, blockHash: BlockHash, from: LedgerSelector): Promise; getBlockHeights(transaction: any, toFetch: { blockHash: BlockHash; account: GenericAccount; }[]): Promise<{ [blockHash: string]: bigint | null; }>; getBlockHeight(transaction: SpannerTransaction, blockHash: BlockHash, account: GenericAccount): Promise; getVotes(transaction: SpannerTransaction, blockHash: BlockHash, from: LedgerSelector): Promise; getVoteStaples(transaction: SpannerTransaction, stapleBlockHashes: VoteBlockHash[], from?: LedgerSelector): Promise>; getHistory(transaction: SpannerTransaction, account: GenericAccount | null, start: VoteBlockHash | null, limit?: number): Promise; getBlockFromPrevious(transaction: SpannerTransaction, prevBlock: BlockHash, from: LedgerSelector): Promise; getVotesFromMultiplePrevious(transaction: SpannerTransaction, prevBlocks: BlockHash[], from: LedgerSelector, issuer?: Account): Promise<{ [hash: string]: Vote[] | null; }>; getHeadBlockHashes(transaction: any, accounts: InstanceType): Promise<{ [account: string]: BlockHash | null; }>; getHeadBlocks(transaction: SpannerTransaction, accounts: GenericAccount[], from: LedgerSelector): Promise<{ [publicKey: string]: Block | null; }>; getAccountInfo(transaction: SpannerTransaction, account: Account | string): Promise>; listOwners(transaction: SpannerTransaction, entity: IdentifierAddress): Promise; listACLsByEntity(transaction: SpannerTransaction, entity: GenericAccount, options?: ListACLsByEntityFilters): Promise; listACLsByPrincipal(transaction: SpannerTransaction, principal: ACLRow['principal'], entityList?: GenericAccount[]): Promise; getVoteStaplesFromBlockHash(transaction: SpannerTransaction, blocks: BlockHash[], from: LedgerSelector): Promise; getVotesAfter(transaction: SpannerTransaction, moment: Date, startKey?: string, options?: GetVotesAfterOptions): Promise; protected gcBatch(transaction: SpannerTransaction): Promise; getNextSerialNumber(): Promise; getAccountCertificates(transaction: SpannerTransaction, account: GenericAccount): Promise; getAccountCertificateByHash(transaction: SpannerTransaction, account: GenericAccount, certificateHash: CertificateHash): Promise; getIdempotentBlockHash(transaction: SpannerTransaction, idempotent: IdempotentKey, from: LedgerSelector, excludeBlockHash?: BlockHash): Promise; stats(): Promise; } export declare const Testing: { /** * Create a new Spanner Instance (if first call), new Spanner Database, and all the tables needed to use this ledger */ createDatabase: (config: SpannerConfig, createInstance: boolean) => Promise; /** * Clean-up a Spanner Database (and if deleteInstance) delete the Spanner Instance */ deleteDatabase: (config: SpannerConfig, deleteInstance: boolean, database: GoogleSpannerDatabase) => Promise; }; export default DBSpanner;