@unruggable/gateways
Version:
Trustless Ethereum Multichain CCIP-Read Gateway
35 lines (34 loc) • 1.52 kB
JavaScript
import { AbstractRollup, align } 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;
}
async fetchLatestCommitIndex() {
return align(await fetchBlockNumber(this.provider1, this.latestBlockTag), this.commitStep);
}
async _fetchParentCommitIndex(commit) {
return align(commit.index - 1n, this.commitStep);
}
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
}
}