@ensdomains/unruggable-gateways
Version:
Trustless Ethereum Multichain CCIP-Read Gateway
51 lines (50 loc) • 1.85 kB
JavaScript
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;
}
}