UNPKG

@unruggable/gateways

Version:

Trustless Ethereum Multichain CCIP-Read Gateway

35 lines (34 loc) 1.52 kB
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 } }