@unruggable/gateways
Version:
Trustless Ethereum Multichain CCIP-Read Gateway
215 lines (214 loc) • 9.46 kB
JavaScript
;
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;