From d8f26ea6de6630a0692fcf8af4eee2c9c4a35a97 Mon Sep 17 00:00:00 2001 From: Patrick Schork <354473+pschork@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:05:55 -0700 Subject: [PATCH] Integrate Ejection Manager into eigenda-operator-state subgraphs Abstract networks to handle lack of preprod-holesky support on graph cli Add Makefile with deploy targets --- subgraphs/eigenda-operator-state/Makefile | 16 + subgraphs/eigenda-operator-state/VERSION | 1 + .../abis/EjectionManager.json | 300 ++++++++++++++++++ .../networks/mainnet.json | 28 ++ .../networks/preprod.json | 28 ++ .../networks/testnet.json | 28 ++ .../eigenda-operator-state/schema.graphql | 56 ++++ .../src/ejection-manager.ts | 104 ++++++ .../{templates => }/subgraph.yaml | 73 +++-- .../templates/networks.json | 156 --------- 10 files changed, 616 insertions(+), 174 deletions(-) create mode 100644 subgraphs/eigenda-operator-state/Makefile create mode 100644 subgraphs/eigenda-operator-state/VERSION create mode 100644 subgraphs/eigenda-operator-state/abis/EjectionManager.json create mode 100644 subgraphs/eigenda-operator-state/networks/mainnet.json create mode 100644 subgraphs/eigenda-operator-state/networks/preprod.json create mode 100644 subgraphs/eigenda-operator-state/networks/testnet.json create mode 100644 subgraphs/eigenda-operator-state/src/ejection-manager.ts rename subgraphs/eigenda-operator-state/{templates => }/subgraph.yaml (64%) delete mode 100644 subgraphs/eigenda-operator-state/templates/networks.json diff --git a/subgraphs/eigenda-operator-state/Makefile b/subgraphs/eigenda-operator-state/Makefile new file mode 100644 index 0000000000..77bc24031e --- /dev/null +++ b/subgraphs/eigenda-operator-state/Makefile @@ -0,0 +1,16 @@ +.PHONY: codegen + +VERSION := $(shell cat ./VERSION) + +codegen: + graph clean + graph codegen + +deploy-preprod: + graph deploy eigenda-operator-state-preprod-holesky --version-label ${VERSION} --node https://subgraphs.alchemy.com/api/subgraphs/deploy --deploy-key ${DEPLOY_KEY} --network holesky --ipfs https://ipfs.satsuma.xyz --network-file networks/preprod.json + +deploy-testnet: + graph deploy eigenda-operator-state-holesky --version-label ${VERSION} --node https://subgraphs.alchemy.com/api/subgraphs/deploy --deploy-key ${DEPLOY_KEY} --network holesky --ipfs https://ipfs.satsuma.xyz --network-file networks/testnet.json + +deploy-mainnet: + graph deploy eigenda-operator-state-mainnet --version-label ${VERSION} --node https://subgraphs.alchemy.com/api/subgraphs/deploy --deploy-key ${DEPLOY_KEY} --network mainnet --ipfs https://ipfs.satsuma.xyz --network-file networks/mainnet.json diff --git a/subgraphs/eigenda-operator-state/VERSION b/subgraphs/eigenda-operator-state/VERSION new file mode 100644 index 0000000000..8b20e48523 --- /dev/null +++ b/subgraphs/eigenda-operator-state/VERSION @@ -0,0 +1 @@ +v0.7.0 diff --git a/subgraphs/eigenda-operator-state/abis/EjectionManager.json b/subgraphs/eigenda-operator-state/abis/EjectionManager.json new file mode 100644 index 0000000000..5d5736c38d --- /dev/null +++ b/subgraphs/eigenda-operator-state/abis/EjectionManager.json @@ -0,0 +1,300 @@ +[ + { + "inputs": [ + { + "internalType": "contract IRegistryCoordinator", + "name": "_registryCoordinator", + "type": "address" + }, + { + "internalType": "contract IStakeRegistry", + "name": "_stakeRegistry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "ejector", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "EjectorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "operatorId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "quorumNumber", + "type": "uint8" + } + ], + "name": "OperatorEjected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ejectedOperators", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "ratelimitHit", + "type": "bool" + } + ], + "name": "QuorumEjection", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "quorumNumber", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "rateLimitWindow", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "ejectableStakePercent", + "type": "uint16" + } + ], + "name": "QuorumEjectionParamsSet", + "type": "event" + }, + { + "inputs": [ + { "internalType": "uint8", "name": "_quorumNumber", "type": "uint8" } + ], + "name": "amountEjectableForQuorum", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[][]", + "name": "_operatorIds", + "type": "bytes32[][]" + } + ], + "name": "ejectOperators", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_owner", "type": "address" }, + { "internalType": "address[]", "name": "_ejectors", "type": "address[]" }, + { + "components": [ + { + "internalType": "uint32", + "name": "rateLimitWindow", + "type": "uint32" + }, + { + "internalType": "uint16", + "name": "ejectableStakePercent", + "type": "uint16" + } + ], + "internalType": "struct IEjectionManager.QuorumEjectionParams[]", + "name": "_quorumEjectionParams", + "type": "tuple[]" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "isEjector", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "name": "quorumEjectionParams", + "outputs": [ + { "internalType": "uint32", "name": "rateLimitWindow", "type": "uint32" }, + { + "internalType": "uint16", + "name": "ejectableStakePercent", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "registryCoordinator", + "outputs": [ + { + "internalType": "contract IRegistryCoordinator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_ejector", "type": "address" }, + { "internalType": "bool", "name": "_status", "type": "bool" } + ], + "name": "setEjector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint8", "name": "_quorumNumber", "type": "uint8" }, + { + "components": [ + { + "internalType": "uint32", + "name": "rateLimitWindow", + "type": "uint32" + }, + { + "internalType": "uint16", + "name": "ejectableStakePercent", + "type": "uint16" + } + ], + "internalType": "struct IEjectionManager.QuorumEjectionParams", + "name": "_quorumEjectionParams", + "type": "tuple" + } + ], + "name": "setQuorumEjectionParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint8", "name": "", "type": "uint8" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ], + "name": "stakeEjectedForQuorum", + "outputs": [ + { "internalType": "uint256", "name": "timestamp", "type": "uint256" }, + { "internalType": "uint256", "name": "stakeEjected", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeRegistry", + "outputs": [ + { + "internalType": "contract IStakeRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/subgraphs/eigenda-operator-state/networks/mainnet.json b/subgraphs/eigenda-operator-state/networks/mainnet.json new file mode 100644 index 0000000000..da81783f6e --- /dev/null +++ b/subgraphs/eigenda-operator-state/networks/mainnet.json @@ -0,0 +1,28 @@ +{ + "mainnet": { + "RegistryCoordinator": { + "address": "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656", + "startBlock": 19592322 + }, + "BLSApkRegistry": { + "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", + "startBlock": 19592322 + }, + "BLSApkRegistry_Operator": { + "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", + "startBlock": 19592322 + }, + "RegistryCoordinator_Operator": { + "address": "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656", + "startBlock": 19592322 + }, + "BLSApkRegistry_QuorumApkUpdates": { + "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", + "startBlock": 19592322 + }, + "EjectionManager": { + "address": "0x130d8EA0052B45554e4C99079B84df292149Bd5E", + "startBlock": 19839949 + } + } +} diff --git a/subgraphs/eigenda-operator-state/networks/preprod.json b/subgraphs/eigenda-operator-state/networks/preprod.json new file mode 100644 index 0000000000..0961fdea14 --- /dev/null +++ b/subgraphs/eigenda-operator-state/networks/preprod.json @@ -0,0 +1,28 @@ +{ + "holesky": { + "RegistryCoordinator": { + "address": "0x2c61EA360D6500b58E7f481541A36B443Bc858c6", + "startBlock": 1161126 + }, + "BLSApkRegistry": { + "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", + "startBlock": 1161126 + }, + "BLSApkRegistry_Operator": { + "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", + "startBlock": 1161126 + }, + "RegistryCoordinator_Operator": { + "address": "0x2c61EA360D6500b58E7f481541A36B443Bc858c6", + "startBlock": 1161126 + }, + "BLSApkRegistry_QuorumApkUpdates": { + "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", + "startBlock": 1161126 + }, + "EjectionManager": { + "address": "0xEEed164605833263B7690bB521983b777D128698", + "startBlock": 1367682 + } + } +} diff --git a/subgraphs/eigenda-operator-state/networks/testnet.json b/subgraphs/eigenda-operator-state/networks/testnet.json new file mode 100644 index 0000000000..451d1bd76e --- /dev/null +++ b/subgraphs/eigenda-operator-state/networks/testnet.json @@ -0,0 +1,28 @@ +{ + "holesky": { + "RegistryCoordinator": { + "address": "0x53012C69A189cfA2D9d29eb6F19B32e0A2EA3490", + "startBlock": 1168409 + }, + "BLSApkRegistry": { + "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", + "startBlock": 1168409 + }, + "BLSApkRegistry_Operator": { + "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", + "startBlock": 1168409 + }, + "RegistryCoordinator_Operator": { + "address": "0x53012C69A189cfA2D9d29eb6F19B32e0A2EA3490", + "startBlock": 1168409 + }, + "BLSApkRegistry_QuorumApkUpdates": { + "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", + "startBlock": 1168409 + }, + "EjectionManager": { + "address": "0x6979bF665e54cd15bd7194BD25C853870038558a", + "startBlock": 1367721 + } + } +} diff --git a/subgraphs/eigenda-operator-state/schema.graphql b/subgraphs/eigenda-operator-state/schema.graphql index 02f5ab9787..6b54c1c80d 100644 --- a/subgraphs/eigenda-operator-state/schema.graphql +++ b/subgraphs/eigenda-operator-state/schema.graphql @@ -81,6 +81,62 @@ type NewPubkeyRegistration @entity(immutable: true) { transactionHash: Bytes! } +## EjectionManager + +type EjectorUpdated @entity(immutable: true) { + id: Bytes! + ejector: Bytes! # address + status: Boolean! # bool + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type Initialized @entity(immutable: true) { + id: Bytes! + version: Int! # uint8 + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type OperatorEjected @entity(immutable: true) { + id: Bytes! + operatorId: Bytes! # bytes32 + quorumNumber: Int! # uint8 + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type OwnershipTransferred @entity(immutable: true) { + id: Bytes! + previousOwner: Bytes! # address + newOwner: Bytes! # address + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type QuorumEjection @entity(immutable: true) { + id: Bytes! + ejectedOperators: BigInt! # uint32 + ratelimitHit: Boolean! # bool + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + +type QuorumEjectionParamsSet @entity(immutable: true) { + id: Bytes! + quorumNumber: Int! # uint8 + rateLimitWindow: BigInt! # uint32 + ejectableStakePercent: Int! # uint16 + blockNumber: BigInt! + blockTimestamp: BigInt! + transactionHash: Bytes! +} + ## Custom type Operator @entity { diff --git a/subgraphs/eigenda-operator-state/src/ejection-manager.ts b/subgraphs/eigenda-operator-state/src/ejection-manager.ts new file mode 100644 index 0000000000..03da126bc8 --- /dev/null +++ b/subgraphs/eigenda-operator-state/src/ejection-manager.ts @@ -0,0 +1,104 @@ +import { + EjectorUpdated as EjectorUpdatedEvent, + Initialized as InitializedEvent, + OperatorEjected as OperatorEjectedEvent, + OwnershipTransferred as OwnershipTransferredEvent, + QuorumEjection as QuorumEjectionEvent, + QuorumEjectionParamsSet as QuorumEjectionParamsSetEvent +} from "../generated/EjectionManager/EjectionManager" +import { + EjectorUpdated, + Initialized, + OperatorEjected, + OwnershipTransferred, + QuorumEjection, + QuorumEjectionParamsSet +} from "../generated/schema" + +export function handleEjectorUpdated(event: EjectorUpdatedEvent): void { + let entity = new EjectorUpdated( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.ejector = event.params.ejector + entity.status = event.params.status + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} + +export function handleInitialized(event: InitializedEvent): void { + let entity = new Initialized( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.version = event.params.version + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} + +export function handleOperatorEjected(event: OperatorEjectedEvent): void { + let entity = new OperatorEjected( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.operatorId = event.params.operatorId + entity.quorumNumber = event.params.quorumNumber + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} + +export function handleOwnershipTransferred( + event: OwnershipTransferredEvent +): void { + let entity = new OwnershipTransferred( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.previousOwner = event.params.previousOwner + entity.newOwner = event.params.newOwner + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} + +export function handleQuorumEjection(event: QuorumEjectionEvent): void { + let entity = new QuorumEjection( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.ejectedOperators = event.params.ejectedOperators + entity.ratelimitHit = event.params.ratelimitHit + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} + +export function handleQuorumEjectionParamsSet( + event: QuorumEjectionParamsSetEvent +): void { + let entity = new QuorumEjectionParamsSet( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ) + entity.quorumNumber = event.params.quorumNumber + entity.rateLimitWindow = event.params.rateLimitWindow + entity.ejectableStakePercent = event.params.ejectableStakePercent + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() +} diff --git a/subgraphs/eigenda-operator-state/templates/subgraph.yaml b/subgraphs/eigenda-operator-state/subgraph.yaml similarity index 64% rename from subgraphs/eigenda-operator-state/templates/subgraph.yaml rename to subgraphs/eigenda-operator-state/subgraph.yaml index 37098ac04a..aec05ff789 100644 --- a/subgraphs/eigenda-operator-state/templates/subgraph.yaml +++ b/subgraphs/eigenda-operator-state/subgraph.yaml @@ -4,11 +4,11 @@ schema: dataSources: - kind: ethereum name: RegistryCoordinator - network: devnet + network: mainnet source: - address: "0x0000000000000000000000000000000000000000" abi: RegistryCoordinator - startBlock: 0 + address: "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656" + startBlock: 19592322 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -37,11 +37,11 @@ dataSources: file: ./src/registry-coordinator.ts - kind: ethereum name: BLSApkRegistry - network: devnet + network: mainnet source: - address: "0x0000000000000000000000000000000000000000" abi: BLSApkRegistry - startBlock: 0 + address: "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505" + startBlock: 19592322 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -57,16 +57,17 @@ dataSources: handler: handleOperatorAddedToQuorums - event: OperatorRemovedFromQuorums(address,bytes32,bytes) handler: handleOperatorRemovedFromQuorums - - event: NewPubkeyRegistration(indexed address,(uint256,uint256),(uint256[2],uint256[2])) + - event: NewPubkeyRegistration(indexed + address,(uint256,uint256),(uint256[2],uint256[2])) handler: handleNewPubkeyRegistration file: ./src/bls-apk-registry.ts - kind: ethereum name: BLSApkRegistry_Operator - network: devnet + network: mainnet source: - address: "0x0000000000000000000000000000000000000000" abi: BLSApkRegistry - startBlock: 0 + address: "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505" + startBlock: 19592322 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -77,16 +78,17 @@ dataSources: - name: BLSApkRegistry file: ./abis/BLSApkRegistry.json eventHandlers: - - event: NewPubkeyRegistration(indexed address,(uint256,uint256),(uint256[2],uint256[2])) + - event: NewPubkeyRegistration(indexed + address,(uint256,uint256),(uint256[2],uint256[2])) handler: handleNewPubkeyRegistration file: ./src/operator-creation.ts - kind: ethereum name: RegistryCoordinator_Operator - network: devnet + network: mainnet source: - address: "0x0000000000000000000000000000000000000000" abi: RegistryCoordinator - startBlock: 0 + address: "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656" + startBlock: 19592322 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -105,11 +107,11 @@ dataSources: file: ./src/operator-registration-status.ts - kind: ethereum name: BLSApkRegistry_QuorumApkUpdates - network: devnet + network: mainnet source: - address: "0x0000000000000000000000000000000000000000" abi: BLSApkRegistry - startBlock: 0 + address: "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505" + startBlock: 19592322 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -125,4 +127,39 @@ dataSources: handler: handleOperatorAddedToQuorums - event: OperatorRemovedFromQuorums(address,bytes32,bytes) handler: handleOperatorRemovedFromQuorums - file: ./src/quorum-apk-updates.ts \ No newline at end of file + file: ./src/quorum-apk-updates.ts + - kind: ethereum + name: EjectionManager + network: mainnet + source: + abi: EjectionManager + address: "0x130d8EA0052B45554e4C99079B84df292149Bd5E" + startBlock: 19839949 + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - EjectorUpdated + - Initialized + - OperatorEjected + - OwnershipTransferred + - QuorumEjection + - QuorumEjectionParamsSet + abis: + - name: EjectionManager + file: ./abis/EjectionManager.json + eventHandlers: + - event: EjectorUpdated(address,bool) + handler: handleEjectorUpdated + - event: Initialized(uint8) + handler: handleInitialized + - event: OperatorEjected(bytes32,uint8) + handler: handleOperatorEjected + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleOwnershipTransferred + - event: QuorumEjection(uint32,bool) + handler: handleQuorumEjection + - event: QuorumEjectionParamsSet(uint8,uint32,uint16) + handler: handleQuorumEjectionParamsSet + file: ./src/ejection-manager.ts diff --git a/subgraphs/eigenda-operator-state/templates/networks.json b/subgraphs/eigenda-operator-state/templates/networks.json deleted file mode 100644 index 15449866e8..0000000000 --- a/subgraphs/eigenda-operator-state/templates/networks.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "devnet": { - "RegistryCoordinator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry_Operator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "RegistryCoordinator_Operator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - } - }, - "anvil": { - "RegistryCoordinator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry_Operator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "RegistryCoordinator_Operator": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0x0000000000000000000000000000000000000000", - "startBlock": 0 - } - }, - "preprod-goerli": { - "RegistryCoordinator": { - "address": "0x5d1d838C2952cbc7da3ee76E836312e889CabFB9", - "startBlock": 10470500 - }, - "BLSApkRegistry": { - "address": "0xe47b025ed3C54D391c4E0738c6EF050D40dd79b5", - "startBlock": 10470500 - }, - "BLSApkRegistry_Operator": { - "address": "0xe47b025ed3C54D391c4E0738c6EF050D40dd79b5", - "startBlock": 10470500 - }, - "RegistryCoordinator_Operator": { - "address": "0x5d1d838C2952cbc7da3ee76E836312e889CabFB9", - "startBlock": 10470500 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0xe47b025ed3C54D391c4E0738c6EF050D40dd79b5", - "startBlock": 10470500 - } - }, - "preprod-holesky": { - "RegistryCoordinator": { - "address": "0x2c61EA360D6500b58E7f481541A36B443Bc858c6", - "startBlock": 1161126 - }, - "BLSApkRegistry": { - "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", - "startBlock": 1161126 - }, - "BLSApkRegistry_Operator": { - "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", - "startBlock": 1161126 - }, - "RegistryCoordinator_Operator": { - "address": "0x2c61EA360D6500b58E7f481541A36B443Bc858c6", - "startBlock": 1161126 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0xAd7f9e558170a149Ca8E90f41Ab2444A5d3bd6aD", - "startBlock": 1161126 - } - }, - "goerli": { - "RegistryCoordinator": { - "address": "0x7661dA87296c0A245d11ADeD7f48265463bc3eC6", - "startBlock": 10497644 - }, - "BLSApkRegistry": { - "address": "0xb406d8e5F4BA1430D57c8231cc872C2c369E1F5F", - "startBlock": 10497644 - }, - "BLSApkRegistry_Operator": { - "address": "0xb406d8e5F4BA1430D57c8231cc872C2c369E1F5F", - "startBlock": 10497644 - }, - "RegistryCoordinator_Operator": { - "address": "0x7661dA87296c0A245d11ADeD7f48265463bc3eC6", - "startBlock": 10497644 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0xb406d8e5F4BA1430D57c8231cc872C2c369E1F5F", - "startBlock": 10497644 - } - }, - "holesky": { - "RegistryCoordinator": { - "address": "0x53012C69A189cfA2D9d29eb6F19B32e0A2EA3490", - "startBlock": 1168409 - }, - "BLSApkRegistry": { - "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", - "startBlock": 1168409 - }, - "BLSApkRegistry_Operator": { - "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", - "startBlock": 1168409 - }, - "RegistryCoordinator_Operator": { - "address": "0x53012C69A189cfA2D9d29eb6F19B32e0A2EA3490", - "startBlock": 1168409 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0x066cF95c1bf0927124DFB8B02B401bc23A79730D", - "startBlock": 1168409 - } - }, - "mainnet": { - "RegistryCoordinator": { - "address": "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656", - "startBlock": 19592322 - }, - "BLSApkRegistry": { - "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", - "startBlock": 19592322 - }, - "BLSApkRegistry_Operator": { - "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", - "startBlock": 19592322 - }, - "RegistryCoordinator_Operator": { - "address": "0x0BAAc79acD45A023E19345c352d8a7a83C4e5656", - "startBlock": 19592322 - }, - "BLSApkRegistry_QuorumApkUpdates": { - "address": "0x00A5Fd09F6CeE6AE9C8b0E5e33287F7c82880505", - "startBlock": 19592322 - } - } -}