UNPKG

@unruggable/gateways

Version:

Trustless Ethereum Multichain CCIP-Read Gateway

215 lines (214 loc) 9.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OPRollup = exports.OUTPUT_FINDER_ABI = void 0; const AbstractOPRollup_js_1 = require("./AbstractOPRollup.cjs"); const chains_js_1 = require("../chains.cjs"); const utils_js_1 = require("../utils.cjs"); const contract_1 = require("ethers/contract"); const abi_1 = require("ethers/abi"); exports.OUTPUT_FINDER_ABI = new abi_1.Interface([ `error OutputNotFound()`, `function findOutputIndex(address portal, uint256 minAgeSec) view returns (uint256)`, `function getOutput(address portal, uint256 outputIndex) view returns ( (bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) )`, ]); const OUTPUT_FINDER_MAINNET = '0xFe75ecc04DB4f46762126924d21Ae3d35087c482'; const OUTPUT_FINDER_SEPOLIA = ''; //to deploy const OUTPUT_FINDER_HOLESKY = '0x35FF17ae0a5ac38F66E7994401a3c304023881Ad'; const OUTPUT_FINDER_OP_BNB = '0x57C2F437E0a5E155ced91a7A17bfc372C0aF7B05'; class OPRollup extends AbstractOPRollup_js_1.AbstractOPRollup { minAgeSec; // 20241030: changed to fault proofs // https://x.com/base/status/1851672364439814529 // static readonly baseMainnetConfig: RollupDeployment<OPConfig> = { // chain1: CHAINS.MAINNET, // chain2: CHAINS.BASE, // L2OutputOracle: '0x56315b90c40730925ec5485cf004d835058518A0', // }; // 20250130: changed to fault proofs // https://x.com/world_chain_/status/1880364416400838733 // https://docs.worldcoin.org/world-chain/developers/world-chain-contracts // static readonly worldMainnetConfig: RollupDeployment<OPConfig> = { // chain1: CHAINS.MAINNET, // chain2: CHAINS.WORLD, // L2OutputOracle: '0x19A6d1E9034596196295CF148509796978343c5D', // }; // https://docs.blast.io/building/contracts#mainnet static blastMainnnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.BLAST, OptimismPortal: '0x0Ec68c5B10F21EFFb74f2A5C61DFe6b08C0Db6Cb', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.frax.com/fraxtal/addresses/fraxtal-contracts#mainnet static fraxtalMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.FRAXTAL, OptimismPortal: '0x36cb65c1967A0Fb0EEE11569C51C2f2aA1Ca6f6D', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.zora.co/zora-network/network#zora-network-mainnet-1 static zoraMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.ZORA, OptimismPortal: '0x1a0ad011913A150f69f6A19DF447A0CfD9551054', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.mantle.xyz/network/system-information/on-chain-system/key-l1-contract-address static mantleMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.MANTLE, OptimismPortal: '0x31d543e7BE1dA6eFDc2206Ef7822879045B9f481', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.mode.network/general-info/mainnet-contract-addresses/l1-l2-contracts static modeMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.MODE, OptimismPortal: '0xc54cb22944F2bE476E02dECfCD7e3E7d3e15A8Fb', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.cyber.co/build-on-cyber/addresses-mainnet // https://docs.cyber.co/build-on-cyber/addresses-testnet static cyberMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.CYBER, OptimismPortal: '0x1d59bc9fcE6B8E2B1bf86D4777289FFd83D24C99', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://redstone.xyz/docs/contract-addresses static redstoneMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.REDSTONE, OptimismPortal: '0xa426A052f657AEEefc298b3B5c35a470e4739d69', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.shape.network/documentation/technical-details/contract-addresses#mainnet static shapeMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.SHAPE, OptimismPortal: '0xEB06fFa16011B5628BaB98E29776361c83741dd3', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.bnbchain.org/bnb-opbnb/core-concepts/opbnb-protocol-addresses/ static opBNBMainnetConfig = { chain1: chains_js_1.CHAINS.BSC, chain2: chains_js_1.CHAINS.OP_BNB, OptimismPortal: '0x4386C8ABf2009aC0c263462Da568DD9d46e52a31', OutputFinder: OUTPUT_FINDER_OP_BNB, }; // https://storage.googleapis.com/cel2-rollup-files/alfajores/deployment-l1.json static celoAlfajoresConfig = { chain1: chains_js_1.CHAINS.HOLESKY, chain2: chains_js_1.CHAINS.CELO_ALFAJORES, OptimismPortal: '0x82527353927d8D069b3B452904c942dA149BA381', OutputFinder: OUTPUT_FINDER_HOLESKY, }; // https://docs.worldcoin.org/world-chain/developers/world-chain-contracts static worldMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.WORLD, OptimismPortal: '0xd5ec14a83B7d95BE1E2Ac12523e2dEE12Cbeea6C', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.zircuit.com/smart-contracts/contract_addresses static zircuitMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.ZIRCUIT, OptimismPortal: '0x17bfAfA932d2e23Bd9B909Fd5B4D2e2a27043fb1', OutputFinder: OUTPUT_FINDER_MAINNET, }; // https://docs.zircuit.com/testnet/contract_addresses static zircuitSepoliaConfig = { chain1: chains_js_1.CHAINS.SEPOLIA, chain2: chains_js_1.CHAINS.ZIRCUIT_SEPOLIA, OptimismPortal: '0x787f1C8c5924178689E0560a43D848bF8E54b23e', OutputFinder: OUTPUT_FINDER_SEPOLIA, }; // https://docs.lisk.com/about-lisk/contracts static liskMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.LISK, OptimismPortal: '0x26dB93F8b8b4f7016240af62F7730979d353f9A7', OutputFinder: OUTPUT_FINDER_MAINNET, }; static liskSepoliaConfig = { chain1: chains_js_1.CHAINS.SEPOLIA, chain2: chains_js_1.CHAINS.LISK_SEPOLIA, OptimismPortal: '0xe3d90F21490686Ec7eF37BE788E02dfC12787264', OutputFinder: OUTPUT_FINDER_SEPOLIA, }; // https://docs.mintchain.io/deploy/contracts#l1-contract-addresses static mintMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.MINT, OptimismPortal: '0x59625d1FE0Eeb8114a4d13c863978F39b3471781', OutputFinder: OUTPUT_FINDER_MAINNET, //commitFreqSec: 12 * 60 * 60 // 12hr }; static mintSepoliaConfig = { chain1: chains_js_1.CHAINS.SEPOLIA, chain2: chains_js_1.CHAINS.MINT_SEPOLIA, OptimismPortal: '0x0f598aFc1c303BF2d0Ee82435b58c7b47BC56Ed1', OutputFinder: OUTPUT_FINDER_SEPOLIA, }; // https://docs.gobob.xyz/learn/reference/contracts/#ethereum-l1 static bobMainnetConfig = { chain1: chains_js_1.CHAINS.MAINNET, chain2: chains_js_1.CHAINS.BOB, OptimismPortal: '0x994e3B01D130944a3E67BFd3B8Fc73069b959FEc', OutputFinder: OUTPUT_FINDER_MAINNET, // commitFreqSec: 12hr }; static bobSepoliaConfig = { chain1: chains_js_1.CHAINS.SEPOLIA, chain2: chains_js_1.CHAINS.BOB_SEPOLIA, OptimismPortal: '0x7FA8cA1ED6F50D829cD960aE398949B5Bc339615', OutputFinder: OUTPUT_FINDER_SEPOLIA, }; OptimismPortal; OutputFinder; constructor(providers, config, minAgeSec = 0) { super(providers); this.minAgeSec = minAgeSec; this.OptimismPortal = config.OptimismPortal; this.OutputFinder = new contract_1.Contract(config.OutputFinder, exports.OUTPUT_FINDER_ABI, providers.provider1); } get unfinalized() { return !!this.minAgeSec; // nonzero => unfinalized } async fetchOutput(index) { try { return await this.OutputFinder.getOutput(this.OptimismPortal, index); } catch (err) { if ((0, utils_js_1.isRevert)(err) && err.revert?.name === 'OutputNotFound') return; throw err; } } async fetchLatestCommitIndex() { return this.OutputFinder.findOutputIndex(this.OptimismPortal, this.minAgeSec, { blockTag: this.latestBlockTag }); } async _fetchCommit(index) { const output = await this.fetchOutput(index); if (!output) throw new Error('invalid output'); const commit = await this.createCommit(index, output.l2BlockNumber); return { ...commit, output }; } async isCommitStillValid(commit) { // see: L2OutputOracle.deleteL2Outputs() const output = await this.fetchOutput(commit.index); if (!output) return false; // undefined => deleted return output.outputRoot === commit.output.outputRoot; // unequal => replaced } windowFromSec(sec) { // finalization time is on-chain // https://github.com/ethereum-optimism/optimism/blob/a81de910dc2fd9b2f67ee946466f2de70d62611a/packages/contracts-bedrock/src/L1/L2OutputOracle.sol#L231 return sec; } } exports.OPRollup = OPRollup;