UNPKG

@ensdomains/unruggable-gateways

Version:

Trustless Ethereum Multichain CCIP-Read Gateway

51 lines (50 loc) 1.85 kB
import { BlockProver, makeStorageKey } from './vm.mjs'; import { AbstractRollup } from './rollup.mjs'; import { ABI_CODER, fetchBlockNumber, fetchStorage, LATEST_BLOCK_TAG, } from './utils.mjs'; import { VOID_PROVIDER } from './VoidProvider.mjs'; export class UncheckedProver extends BlockProver { static latest = this._createLatest(); isContract(target) { target = target.toLowerCase(); return this.cache.get(target, async (a) => { const code = await this.provider.getCode(a, this.block); return code.length > 2; }); } getStorage(target, slot) { target = target.toLowerCase(); return this.cache.get(makeStorageKey(target, slot), () => { return fetchStorage(this.provider, target, slot, this.block); }); } async _proveNeed(need, accountRef, slotRefs) { if (await this.isContract(need.target)) { accountRef.proof = '0x01'; const m = [...slotRefs]; const values = await Promise.all(m.map(([slot]) => this.getStorage(need.target, slot))); m.forEach(([, ref], i) => (ref.proof = values[i])); } } } export class UncheckedRollup extends AbstractRollup { constructor(provider2) { super({ provider1: VOID_PROVIDER, provider2 }); this.latestBlockTag = LATEST_BLOCK_TAG; } get unfinalized() { return true; } async fetchLatestCommitIndex() { return fetchBlockNumber(this.provider2, this.latestBlockTag); } async _fetchCommit(index) { const prover = new UncheckedProver(this.provider2, index); return { index, prover }; } encodeWitness(_commit, proofSeq) { return ABI_CODER.encode(['bytes[]', 'bytes'], [proofSeq.proofs, proofSeq.order]); } windowFromSec(sec) { return sec; } }