UNPKG

@unruggable/gateways

Version:

Trustless Ethereum Multichain CCIP-Read Gateway

271 lines 9.17 kB
import type { BigNumberish, BytesLike, HexAddress, HexString, HexString32, ProofRef, ProofSequence, ProofSequenceV1, Provider } from './types.js'; import { type Unwrappable } from './wrap.js'; import { fetchBlock } from './utils.js'; import { CachedMap, LRU } from './cached.js'; import { GATEWAY_OP as OP } from './ops.js'; import { ProgramReader } from './reader.js'; type HexFuture = Unwrappable<number, HexString>; export declare function solidityArraySlots(slot: BigNumberish, length: number): bigint[]; export declare function solidityFollowSlot(slot: BigNumberish, key: BytesLike): bigint; export declare function pow256(base: bigint, exp: bigint): bigint; export declare class GatewayProgram { readonly ops: number[]; static readonly Opcode: { readonly PUSH_0: 0; readonly PUSH_1: 1; readonly PUSH_2: 2; readonly PUSH_3: 3; readonly PUSH_4: 4; readonly PUSH_5: 5; readonly PUSH_6: 6; readonly PUSH_7: 7; readonly PUSH_8: 8; readonly PUSH_9: 9; readonly PUSH_10: 10; readonly PUSH_11: 11; readonly PUSH_12: 12; readonly PUSH_13: 13; readonly PUSH_14: 14; readonly PUSH_15: 15; readonly PUSH_16: 16; readonly PUSH_17: 17; readonly PUSH_18: 18; readonly PUSH_19: 19; readonly PUSH_20: 20; readonly PUSH_21: 21; readonly PUSH_22: 22; readonly PUSH_23: 23; readonly PUSH_24: 24; readonly PUSH_25: 25; readonly PUSH_26: 26; readonly PUSH_27: 27; readonly PUSH_28: 28; readonly PUSH_29: 29; readonly PUSH_30: 30; readonly PUSH_31: 31; readonly PUSH_32: 32; readonly GET_SLOT: 33; readonly GET_TARGET: 34; readonly STACK_SIZE: 35; readonly IS_CONTRACT: 36; readonly PUSH_BYTES: 40; readonly PUSH_STACK: 41; readonly PUSH_OUTPUT: 42; readonly SET_TARGET: 50; readonly SET_OUTPUT: 51; readonly EVAL_LOOP: 52; readonly EVAL: 53; readonly ASSERT: 54; readonly READ_SLOT: 60; readonly READ_BYTES: 61; readonly READ_ARRAY: 62; readonly READ_HASHED_BYTES: 63; readonly READ_SLOTS: 64; readonly SET_SLOT: 70; readonly ADD_SLOT: 71; readonly FOLLOW: 72; readonly DUP: 80; readonly POP: 81; readonly SWAP: 82; readonly KECCAK: 90; readonly CONCAT: 91; readonly SLICE: 92; readonly LENGTH: 93; readonly PLUS: 100; readonly TIMES: 101; readonly DIVIDE: 102; readonly MOD: 103; readonly POW: 104; readonly AND: 110; readonly OR: 111; readonly XOR: 112; readonly SHIFT_LEFT: 113; readonly SHIFT_RIGHT: 114; readonly NOT: 115; readonly IS_ZERO: 120; readonly EQ: 121; readonly LT: 122; readonly GT: 123; readonly DEBUG: 255; }; constructor(ops?: number[]); clone(): GatewayProgram; op(key: keyof typeof OP): this; protected addByte(x: number): this; protected addBytes(v: Uint8Array): this; toTuple(): Uint8Array[]; encode(): Uint8Array; debug(label?: string): this; read(n?: number): this; readBytes(): this; readHashedBytes(): this; readArray(step: number): this; setTarget(x: HexString): this; target(): this; setOutput(i: number): this; output(): this; eval(): this; evalIf(): this; evalLoop(opts?: { success?: boolean; failure?: boolean; acquire?: boolean; keep?: boolean; count?: number; }): this; exit(exitCode: number): this; assertNonzero(exitCode: number): this; requireContract(exitCode?: number): this; requireNonzero(exitCode?: number): this; setSlot(x: BigNumberish): this; offset(x: BigNumberish): this; addSlot(): this; slot(): this; follow(): this; followIndex(): this; pop(): this; dup(back?: number): this; swap(back?: number): this; pushOutput(i: number): this; pushStack(i: number): this; push(x: BigNumberish | boolean): this; pushStr(s: string): this; pushBytes(v: BytesLike): this; pushProgram(program: GatewayProgram): this; getSlot(): this; getTarget(): this; stackSize(): this; isContract(): this; concat(): this; keccak(): this; slice(x: number, n: number): this; length(): this; plus(): this; twosComplement(): this; subtract(): this; times(): this; divide(): this; mod(): this; pow(): this; and(): this; or(): this; xor(): this; isZero(): this; not(): this; shl(shift: BigNumberish): this; shr(shift: BigNumberish): this; eq(): this; lt(): this; gt(): this; neq(): this; lte(): this; gte(): this; dup2(): this; min(): this; max(): this; } export declare class GatewayRequest extends GatewayProgram { constructor(outputCount?: number); clone(): GatewayRequest; get outputCount(): number; private ensureCapacity; addOutput(): this; drain(count: number): this; } export type TargetNeed = { target: HexAddress; required: boolean; }; export type HashedNeed = { hash: HexFuture; value: HexFuture; }; export type Need = TargetNeed | bigint | HashedNeed; export declare function isTargetNeed(need: Need): need is TargetNeed; export declare function requireV1Needs(needs: Need[]): { slots: bigint[]; target: HexAddress; required: boolean; }; export declare class GatewayVM { readonly outputs: HexFuture[]; readonly maxStack: number; allocBudget: number; readonly needs: Need[]; readonly targets: Map<string, TargetNeed>; static create(outputCount: number, maxStackSize?: number, allocBudget?: number): GatewayVM; target: any; slot: bigint; stack: HexFuture[]; exitCode: number; constructor(outputs: HexFuture[], maxStack: number, allocBudget: number, needs?: Need[], targets?: Map<string, TargetNeed>); checkAlloc(size: number): void; checkOutputIndex(i: number): number; checkStackIndex(i: number): number; checkBack(back: number): number; resolveOutputs(): Promise<string[]>; resolveStack(): Promise<string[]>; push(x: HexFuture): void; pushUint256(x: BigNumberish | boolean): void; pop(): HexFuture; popSlice(n: number): HexFuture[]; popNumber(): Promise<number>; binaryOp(fn: (a: bigint, b: bigint) => bigint | boolean): Promise<void>; } export declare function makeStorageKey(target: HexAddress, slot: bigint): string; export declare abstract class AbstractProver { readonly provider: Provider; readonly proofLRU: LRU<string, any>; readonly cache: CachedMap<string, any>; readonly readBytesAtSupported: Map<string, boolean>; maxStackSize: number; maxUniqueProofs: number; maxUniqueTargets: number; proofBatchSize: number; maxSuppliedBytes: number; maxProvableBytes: number; maxAllocBytes: number; maxEvalDepth: number; fast: boolean; printDebug: boolean; constructor(provider: Provider); abstract get context(): Record<string, any>; checkProofCount(size: number): void; checkStorageProofs(isContract: boolean, slots: bigint[], proofs: any[]): void; proofMap(): Map<string, bigint[]>; abstract isContract(target: HexAddress): Promise<boolean>; abstract getStorage(target: HexAddress, slot: bigint, fast?: boolean): Promise<HexString>; abstract prove(needs: Need[]): Promise<ProofSequence>; proveV1(needs: Need[]): Promise<ProofSequenceV1>; abstract fetchStateRoot(): Promise<HexString32>; abstract fetchTimestamp(): Promise<number>; evalDecoded(v: BytesLike): Promise<GatewayVM>; evalRequest(req: GatewayRequest): Promise<GatewayVM>; evalReader(reader: ProgramReader): Promise<GatewayVM>; private eval; fetchUnprovenStorageBytes(target: HexAddress, slot: bigint): HexFuture; getStorageBytes(target: HexAddress, slot: bigint, fast?: boolean): Promise<{ value: HexFuture; size: number; slots: bigint[]; }>; } export interface LatestProverFactory<P extends AbstractProver> { latest(provider: Provider, relative?: BigNumberish): Promise<P>; } export declare abstract class BlockProver extends AbstractProver { protected static _createLatest<P extends BlockProver>(this: new (...a: ConstructorParameters<typeof BlockProver>) => P): (provider: Provider, relBlockTag?: BigNumberish) => Promise<P>; readonly block: HexString; constructor(provider: Provider, block: BigNumberish); get context(): { block: bigint; }; get blockNumber(): bigint; fetchBlock(): Promise<ReturnType<typeof fetchBlock>>; fetchStateRoot(): Promise<string>; fetchTimestamp(): Promise<number>; protected abstract _proveNeed(need: TargetNeed, accountRef: ProofRef, storageRefs: Map<bigint, ProofRef>): Promise<void>; prove(needs: Need[]): Promise<ProofSequence>; } export {}; //# sourceMappingURL=vm.d.ts.map