Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 144 additions & 0 deletions patches/viem+2.46.1.patch
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
diff --git a/node_modules/viem/_cjs/chains/definitions/lisk.js b/node_modules/viem/_cjs/chains/definitions/lisk.js
index b8f3aed..52449c6 100644
--- a/node_modules/viem/_cjs/chains/definitions/lisk.js
+++ b/node_modules/viem/_cjs/chains/definitions/lisk.js
@@ -28,6 +28,11 @@ exports.lisk = (0, defineChain_js_1.defineChain)({
},
contracts: {
...chainConfig_js_1.chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x0CF7D3706a27CCE2017aEB11E8a9c8b5388c282C',
+ },
+ },
multicall3: {
address: '0xA9d71E1dd7ca26F26e656E66d6AA81ed7f745bf0',
},
diff --git a/node_modules/viem/_cjs/chains/definitions/megaeth.js b/node_modules/viem/_cjs/chains/definitions/megaeth.js
index 6145c71..0aa9e5e 100644
--- a/node_modules/viem/_cjs/chains/definitions/megaeth.js
Expand Down Expand Up @@ -59,6 +75,38 @@ index 6145c71..0aa9e5e 100644
});
//# sourceMappingURL=megaeth.js.map
\ No newline at end of file
diff --git a/node_modules/viem/_cjs/chains/definitions/mode.js b/node_modules/viem/_cjs/chains/definitions/mode.js
index 385c664..e94aa5a 100644
--- a/node_modules/viem/_cjs/chains/definitions/mode.js
+++ b/node_modules/viem/_cjs/chains/definitions/mode.js
@@ -22,6 +22,11 @@ exports.mode = (0, defineChain_js_1.defineChain)({
},
contracts: {
...chainConfig_js_1.chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x6f13EFadABD9269D6cEAd22b448d434A1f1B433E',
+ },
+ },
multicall3: {
address: '0xca11bde05977b3631167028862be2a173976ca11',
blockCreated: 2465882,
diff --git a/node_modules/viem/_cjs/chains/definitions/zora.js b/node_modules/viem/_cjs/chains/definitions/zora.js
index 1bd8ab7..80abec3 100644
--- a/node_modules/viem/_cjs/chains/definitions/zora.js
+++ b/node_modules/viem/_cjs/chains/definitions/zora.js
@@ -28,6 +28,11 @@ exports.zora = (0, defineChain_js_1.defineChain)({
},
contracts: {
...chainConfig_js_1.chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0xB0F15106fa1e473Ddb39790f197275BC979Aa37e',
+ },
+ },
l2OutputOracle: {
[sourceId]: {
address: '0x9E6204F750cD866b299594e2aC9eA824E2e5f95c',
diff --git a/node_modules/viem/_cjs/op-stack/actions/buildProveWithdrawal.js b/node_modules/viem/_cjs/op-stack/actions/buildProveWithdrawal.js
index 8da3482..c2bd84b 100644
--- a/node_modules/viem/_cjs/op-stack/actions/buildProveWithdrawal.js
Expand Down Expand Up @@ -102,6 +150,54 @@ index d8a07c5..6146d65 100644
return !l2BlockNumber || blockNumber > l2BlockNumber
? { ...game, l2BlockNumber: blockNumber }
: null;
diff --git a/node_modules/viem/_esm/chains/definitions/lisk.js b/node_modules/viem/_esm/chains/definitions/lisk.js
index b01288b..7f302f9 100644
--- a/node_modules/viem/_esm/chains/definitions/lisk.js
+++ b/node_modules/viem/_esm/chains/definitions/lisk.js
@@ -25,6 +25,11 @@ export const lisk = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x0CF7D3706a27CCE2017aEB11E8a9c8b5388c282C',
+ },
+ },
multicall3: {
address: '0xA9d71E1dd7ca26F26e656E66d6AA81ed7f745bf0',
},
diff --git a/node_modules/viem/_esm/chains/definitions/mode.js b/node_modules/viem/_esm/chains/definitions/mode.js
index abb4aad..983a673 100644
--- a/node_modules/viem/_esm/chains/definitions/mode.js
+++ b/node_modules/viem/_esm/chains/definitions/mode.js
@@ -19,6 +19,11 @@ export const mode = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x6f13EFadABD9269D6cEAd22b448d434A1f1B433E',
+ },
+ },
multicall3: {
address: '0xca11bde05977b3631167028862be2a173976ca11',
blockCreated: 2465882,
diff --git a/node_modules/viem/_esm/chains/definitions/zora.js b/node_modules/viem/_esm/chains/definitions/zora.js
index f7fcd35..d7f8101 100644
--- a/node_modules/viem/_esm/chains/definitions/zora.js
+++ b/node_modules/viem/_esm/chains/definitions/zora.js
@@ -25,6 +25,11 @@ export const zora = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0xB0F15106fa1e473Ddb39790f197275BC979Aa37e',
+ },
+ },
l2OutputOracle: {
[sourceId]: {
address: '0x9E6204F750cD866b299594e2aC9eA824E2e5f95c',
diff --git a/node_modules/viem/_types/chains/definitions/megaeth.d.ts b/node_modules/viem/_types/chains/definitions/megaeth.d.ts
index dfe94a1..bf5e7bc 100644
--- a/node_modules/viem/_types/chains/definitions/megaeth.d.ts
Expand Down Expand Up @@ -157,3 +253,51 @@ index 1697039..85e7e81 100644
export type MulticallBatchOptions = {
/** The maximum size (in bytes) for each calldata chunk. @default 1_024 */
batchSize?: number | undefined;
diff --git a/node_modules/viem/chains/definitions/lisk.ts b/node_modules/viem/chains/definitions/lisk.ts
index 8422310..5e92d0c 100644
--- a/node_modules/viem/chains/definitions/lisk.ts
+++ b/node_modules/viem/chains/definitions/lisk.ts
@@ -27,6 +27,11 @@ export const lisk = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x0CF7D3706a27CCE2017aEB11E8a9c8b5388c282C',
+ },
+ },
multicall3: {
address: '0xA9d71E1dd7ca26F26e656E66d6AA81ed7f745bf0',
},
diff --git a/node_modules/viem/chains/definitions/mode.ts b/node_modules/viem/chains/definitions/mode.ts
index 656a580..f80211a 100644
--- a/node_modules/viem/chains/definitions/mode.ts
+++ b/node_modules/viem/chains/definitions/mode.ts
@@ -21,6 +21,11 @@ export const mode = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0x6f13EFadABD9269D6cEAd22b448d434A1f1B433E',
+ },
+ },
multicall3: {
address: '0xca11bde05977b3631167028862be2a173976ca11',
blockCreated: 2465882,
diff --git a/node_modules/viem/chains/definitions/zora.ts b/node_modules/viem/chains/definitions/zora.ts
index 820f1c8..bc6c110 100644
--- a/node_modules/viem/chains/definitions/zora.ts
+++ b/node_modules/viem/chains/definitions/zora.ts
@@ -27,6 +27,11 @@ export const zora = /*#__PURE__*/ defineChain({
},
contracts: {
...chainConfig.contracts,
+ disputeGameFactory: {
+ [sourceId]: {
+ address: '0xB0F15106fa1e473Ddb39790f197275BC979Aa37e',
+ },
+ },
l2OutputOracle: {
[sourceId]: {
address: '0x9E6204F750cD866b299594e2aC9eA824E2e5f95c',
13 changes: 10 additions & 3 deletions src/clients/EventListener.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import assert from "assert";
import { EventEmitter } from "node:events";
import * as chains from "viem/chains";
import { AbiEvent, BaseError, Block, createPublicClient, http, Log as viemLog, parseAbiItem, webSocket } from "viem";
import { Log } from "../interfaces";
import { EventManager, getNetworkName, getNodeUrlList, getOriginFromURL, getProviderHeaders, winston } from "../utils";
import {
EventManager,
getNetworkName,
getNodeUrlList,
getOriginFromURL,
getProviderHeaders,
getViemChain,
winston,
} from "../utils";

function resolveProviders(chainId: number, quorum = 1) {
const protocol = process.env[`RPC_PROVIDERS_TRANSPORT_${chainId}`] ?? "wss";
Expand All @@ -14,7 +21,7 @@ function resolveProviders(chainId: number, quorum = 1) {
const chain = getNetworkName(chainId);
assert(nProviders >= quorum, `Insufficient providers for ${chain} (minimum ${quorum} required by quorum)`);

const viemChain = Object.values(chains).find(({ id }) => id === chainId);
const viemChain = getViemChain(chainId);
const providers = Object.entries(urls).map(([provider, url]) => {
const headers = getProviderHeaders(provider, chainId);
const transport = protocol === "wss" ? webSocket(url) : http(url, { fetchOptions: { headers } });
Expand Down
48 changes: 0 additions & 48 deletions src/common/Constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -790,12 +790,6 @@ export const OPSTACK_CONTRACT_OVERRIDES = {
WETH: TOKEN_SYMBOLS_MAP.WETH.addresses[CHAIN_IDs.BLAST],
},
},
[CHAIN_IDs.LISK]: {
l1: {
DisputeGameFactory: "0x0CF7D3706a27CCE2017aEB11E8a9c8b5388c282C",
},
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
},
[CHAIN_IDs.MEGAETH]: {
l1: {
AddressManager: "0x9754fD3D63B3EAC3fd62b6D54DE4f61b00D6E0Df",
Expand All @@ -811,34 +805,7 @@ export const OPSTACK_CONTRACT_OVERRIDES = {
},
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
},
[CHAIN_IDs.MODE]: {
l1: {
DisputeGameFactory: "0x6f13EFadABD9269D6cEAd22b448d434A1f1B433E",
},
},
[CHAIN_IDs.ZORA]: {
l1: {
DisputeGameFactory: "0xB0F15106fa1e473Ddb39790f197275BC979Aa37e",
},
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
},

// Testnets
[CHAIN_IDs.LISK_SEPOLIA]: {
l1: {
AddressManager: "0x27Bb4A7cd8FB20cb816BF4Aac668BF841bb3D5d3",
L1CrossDomainMessenger: "0x857824E6234f7733ecA4e9A76804fd1afa1A3A2C",
L1StandardBridge: CONTRACT_ADDRESSES[CHAIN_IDs.SEPOLIA].ovmStandardBridge_4202.address,
StateCommitmentChain: ZERO_ADDRESS,
CanonicalTransactionChain: ZERO_ADDRESS,
BondManager: ZERO_ADDRESS,
OptimismPortal: "0xe3d90F21490686Ec7eF37BE788E02dfC12787264",
L2OutputOracle: "0xA0E35F56C318DE1bD5D9ca6A94Fe7e37C5663348",
OptimismPortal2: ZERO_ADDRESS,
DisputeGameFactory: ZERO_ADDRESS,
},
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
},
[CHAIN_IDs.BLAST_SEPOLIA]: {
l1: {
AddressManager: "0x092dD3E2272a372cdfbcCb8F689423F09ED6242a",
Expand All @@ -857,21 +824,6 @@ export const OPSTACK_CONTRACT_OVERRIDES = {
WETH: TOKEN_SYMBOLS_MAP.WETH.addresses[CHAIN_IDs.BLAST_SEPOLIA],
},
},
[CHAIN_IDs.MODE_SEPOLIA]: {
l1: {
AddressManager: "0x83D45725d6562d8CD717673D6bb4c67C07dC1905",
L1CrossDomainMessenger: "0xc19a60d9E8C27B9A43527c3283B4dd8eDC8bE15C",
L1StandardBridge: CONTRACT_ADDRESSES[CHAIN_IDs.SEPOLIA].ovmStandardBridge_919.address,
StateCommitmentChain: ZERO_ADDRESS,
CanonicalTransactionChain: ZERO_ADDRESS,
BondManager: ZERO_ADDRESS,
OptimismPortal: "0x320e1580effF37E008F1C92700d1eBa47c1B23fD",
L2OutputOracle: "0x2634BD65ba27AB63811c74A63118ACb312701Bfa",
OptimismPortal2: ZERO_ADDRESS,
DisputeGameFactory: ZERO_ADDRESS,
},
l2: DEFAULT_L2_CONTRACT_ADDRESSES,
},
};

export const DEFAULT_GAS_MULTIPLIER: { [chainId: number]: number } = {
Expand Down
70 changes: 38 additions & 32 deletions src/finalizer/utils/opStack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
getNetworkName,
getRedisCache,
getUniqueLogIndex,
getViemChain,
groupObjectCountsByProp,
isDefined,
Provider,
Expand Down Expand Up @@ -95,22 +96,33 @@ function assertOpStackTargetChain(chain: viem.Chain): asserts chain is OpStackTa
);
}

// We might want to export this mapping of chain ID to viem chain object out of a constant
// file once we start using Viem elsewhere in the repo:
const VIEM_OP_STACK_CHAINS: Record<number, viem.Chain> = {
[CHAIN_IDs.BASE]: viemChains.base,
[CHAIN_IDs.INK]: viemChains.ink,
[CHAIN_IDs.LISK]: viemChains.lisk,
[CHAIN_IDs.MEGAETH]: viemChains.megaeth, // From patched viem
[CHAIN_IDs.MODE]: viemChains.mode,
[CHAIN_IDs.OPTIMISM]: viemChains.optimism,
[CHAIN_IDs.SONEIUM]: viemChains.soneium,
[CHAIN_IDs.UNICHAIN]: viemChains.unichain,
[CHAIN_IDs.WORLD_CHAIN]: viemChains.worldchain,
[CHAIN_IDs.ZORA]: viemChains.zora,
// // @dev The following chains have non-standard interfaces or processes for withdrawing from L2 to L1
// [CHAIN_IDs.BLAST]: viemChains.blast,
};
/**
* Augment a viem chain definition with disputeGameFactory from OPSTACK_CONTRACT_OVERRIDES
* when the viem chain doesn't already provide one. No-op for chains that already have
* disputeGameFactory in their viem definition.
*
* This is intended as a short-term fix when on-chain changes (e.g. a portal upgrade to
* fault proofs) have not yet been propagated to viem's chain definitions. The preferred
* approach is to upstream the changes to viem, or at least to update the existing viem
* patches in this repository. In the interim, adding a DisputeGameFactory override in
* OPSTACK_CONTRACT_OVERRIDES is acceptable.
*/
function withContractOverrides(chainId: number, chain: viem.Chain): viem.Chain {
const overrides = OPSTACK_CONTRACT_OVERRIDES[chainId]?.l1;
if (!overrides?.DisputeGameFactory || chain.contracts?.disputeGameFactory) {
return chain;
}
const sourceId = chainIsProd(chainId) ? CHAIN_IDs.MAINNET : CHAIN_IDs.SEPOLIA;
return {
...chain,
contracts: {
...chain.contracts,
disputeGameFactory: {
[sourceId]: { address: overrides.DisputeGameFactory as viem.Address },
},
},
};
}

type OVM_CHAIN_ID = (typeof OP_STACK_CHAINS)[number];
type OVM_CROSS_CHAIN_MESSENGER = optimismSDK.CrossChainMessenger;
Expand Down Expand Up @@ -198,7 +210,7 @@ export async function opStackFinalizer(
let callData: Multicall2Call[];
let crossChainTransfers: CrossChainMessage[];

if (VIEM_OP_STACK_CHAINS[chainId]) {
if (!chainIsBlast(chainId)) {
const viemTxns = await viem_multicallOptimismFinalizations(
chainId,
logger,
Expand Down Expand Up @@ -351,19 +363,23 @@ async function viem_multicallOptimismFinalizations(
withdrawals: [],
};
const hubChainId = hubPoolClient.chainId;
const l1Chain: viem.Chain = chainIsProd(chainId) ? viemChains.mainnet : viemChains.sepolia;
const l1Chain = chainIsProd(chainId) ? viemChains.mainnet : viemChains.sepolia;
const publicClientL1 = viem.createPublicClient({
batch: {
multicall: true,
},
chain: l1Chain,
transport: createViemCustomTransportFromEthersProvider(hubChainId),
});
const targetChain = withContractOverrides(chainId, getViemChain(chainId));
// Validate the target chain has the required OP-stack contracts.
assertOpStackTargetChain(targetChain);

const publicClientL2 = viem.createPublicClient({
batch: {
multicall: true,
},
chain: VIEM_OP_STACK_CHAINS[chainId],
chain: targetChain,
transport: createViemCustomTransportFromEthersProvider(chainId),
});
const uniqueTokenhashes = {};
Expand All @@ -376,23 +392,13 @@ async function viem_multicallOptimismFinalizations(
uniqueTokenhashes[event.txnRef] += 1;
}

// Validate the target chain has the required OP-stack contracts.
const targetChainRaw = VIEM_OP_STACK_CHAINS[chainId];
assertOpStackTargetChain(targetChainRaw);

const crossChainMessenger = new Contract(
targetChainRaw.contracts.portal[hubChainId].address,
OPStackPortalL1,
signer
);
const crossChainMessenger = new Contract(targetChain.contracts.portal[hubChainId].address, OPStackPortalL1, signer);
const chain = undefined; // Needed for viem OP type resolution.
const withdrawalStatuses: string[] = [];

// Pass as targetChain to viem OP-stack functions. Viem looks up L2 contracts
// using l1Chain.id (sourceId) and uses custom decoders from targetChain.custom
// for MegaETH.
const targetChain = targetChainRaw;
const chain = undefined; // Needed for viem OP type resolution.

const withdrawalStatuses: string[] = [];
await mapAsync(events, async (event, i) => {
// Useful information for event:
const { decimals, symbol } = getTokenInfo(event.l2TokenAddress, chainId);
Expand Down
Loading