@ensdomains/unruggable-gateways
Version:
Trustless Ethereum Multichain CCIP-Read Gateway
38 lines (37 loc) • 1.59 kB
JavaScript
import { AbstractRollup } from '../rollup.mjs';
import { fetchBlockNumber, ABI_CODER, MAINNET_BLOCK_SEC } from '../utils.mjs';
import { EthProver } from './EthProver.mjs';
import { encodeRlpBlock } from '../rlp.mjs';
import { VOID_PROVIDER } from '../VoidProvider.mjs';
// since a provable block occurs every 12 seconds, caching isn't very effective
// to increase the likelihood of caching, increase the step
// (15 min) * (60 sec/min) / (12 sec/block) = 75 blocks
// note: blockhash() only has 256 depth
export class EthSelfRollup extends AbstractRollup {
commitStep;
constructor(provider, commitStep = 1) {
super({ provider1: provider, provider2: VOID_PROVIDER });
this.commitStep = commitStep > 0 ? BigInt(commitStep) : 1n;
}
align(index) {
return index - (index % this.commitStep);
}
async fetchLatestCommitIndex() {
return this.align(await fetchBlockNumber(this.provider1, this.latestBlockTag));
}
async _fetchParentCommitIndex(commit) {
return this.align(commit.index - 1n);
}
async _fetchCommit(index) {
const prover = new EthProver(this.provider1, index);
const blockInfo = await prover.fetchBlock();
const rlpEncodedBlock = encodeRlpBlock(blockInfo);
return { index, prover, rlpEncodedBlock };
}
encodeWitness(commit, proofSeq) {
return ABI_CODER.encode(['(bytes, bytes[], bytes)'], [[commit.rlpEncodedBlock, proofSeq.proofs, proofSeq.order]]);
}
windowFromSec(sec) {
return Math.ceil(sec / MAINNET_BLOCK_SEC); // units of blocks
}
}