├── .devcontainer
├── Dockerfile
├── devcontainer.json
└── install.sh
├── .dockerignore
├── .gitattributes
├── .github
├── CODEOWNERS
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── documentation.yml
│ ├── enhancement.yml
│ ├── feature.yml
│ └── question.yml
├── actions
│ └── test-coverage
│ │ ├── action.yml
│ │ └── coverage.sh
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ ├── buf-proto.yaml
│ ├── codeql-scanning.yaml
│ ├── compile-protobufs.yaml
│ ├── docker-publish-release.yaml
│ ├── docker-publish.yaml
│ ├── golangci-lint.yml
│ ├── integration-tests.yml
│ ├── mdbook.yaml
│ ├── pr-title.yaml
│ ├── test-contracts.yml
│ └── unit-tests.yml
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── Dockerfile
├── GitVersion.yml
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── api
├── Makefile
├── buf.yaml
├── builder
│ ├── Dockerfile
│ ├── README.md
│ ├── build-docker.sh
│ ├── clean.sh
│ ├── debug-docker.sh
│ ├── is-repo-clean.sh
│ ├── protoc-docker.sh
│ ├── protoc.sh
│ └── rm-docker.sh
├── clients
│ ├── codecs
│ │ ├── blob_codec.go
│ │ ├── blob_codec_test.go
│ │ ├── default_blob_codec.go
│ │ ├── fft.go
│ │ ├── ifft_codec.go
│ │ ├── no_ifft_codec.go
│ │ └── polynomial_form.go
│ ├── config.go
│ ├── config_test.go
│ ├── disperser_client.go
│ ├── disperser_client_test.go
│ ├── eigenda_client.go
│ ├── eigenda_client_e2e_test.go
│ ├── eigenda_client_test.go
│ ├── mock
│ │ ├── disperser_client.go
│ │ ├── disperser_server.go
│ │ ├── node_client.go
│ │ ├── retrieval_client.go
│ │ └── static_request_signer.go
│ ├── node_client.go
│ ├── retrieval_client.go
│ ├── retrieval_client_test.go
│ └── v2
│ │ ├── README.md
│ │ ├── accountant.go
│ │ ├── accountant_test.go
│ │ ├── assets
│ │ └── core_clients_v2.svg
│ │ ├── cert_builder.go
│ │ ├── cert_verifier_address_provider.go
│ │ ├── coretypes
│ │ ├── blob.go
│ │ ├── blob_test.go
│ │ ├── conversion_utils.go
│ │ ├── conversion_utils_test.go
│ │ ├── eigenda_cert.go
│ │ ├── encoded_payload.go
│ │ ├── encoded_payload_test.go
│ │ └── payload.go
│ │ ├── dispersal_request_signer.go
│ │ ├── dispersal_request_signer_test.go
│ │ ├── disperser_client.go
│ │ ├── disperser_client_test.go
│ │ ├── examples
│ │ ├── client_construction.go
│ │ ├── example_relay_retrieval_test.go
│ │ ├── example_validator_retrieval_test.go
│ │ └── utils.go
│ │ ├── mock
│ │ ├── node_client.go
│ │ ├── relay_client.go
│ │ └── retrieval_client.go
│ │ ├── node_client.go
│ │ ├── payload_client_config.go
│ │ ├── payload_retriever.go
│ │ ├── payloaddispersal
│ │ ├── check_thresholds.go
│ │ ├── payload_disperser.go
│ │ └── payload_disperser_config.go
│ │ ├── payloadretrieval
│ │ ├── relay_payload_retriever.go
│ │ ├── relay_payload_retriever_config.go
│ │ ├── relay_payload_retriever_test.go
│ │ ├── test
│ │ │ └── test_relay_url_provider.go
│ │ ├── validator_payload_retriever.go
│ │ └── validator_payload_retriever_config.go
│ │ ├── relay
│ │ ├── key_lock.go
│ │ ├── key_lock_test.go
│ │ ├── relay_client.go
│ │ └── relay_url_provider.go
│ │ ├── utils.go
│ │ ├── validator
│ │ ├── internal
│ │ │ ├── blob_decoder.go
│ │ │ ├── chunk_deserializer.go
│ │ │ └── validator_grpc_manager.go
│ │ ├── mock
│ │ │ ├── mock_blob_decoder.go
│ │ │ ├── mock_chunk_deserializer.go
│ │ │ └── mock_validator_grpc_manager.go
│ │ ├── retrieval_worker.go
│ │ ├── validator_client.go
│ │ ├── validator_client_config.go
│ │ ├── validator_client_metrics.go
│ │ ├── validator_client_test.go
│ │ └── validator_non_mock_test.go
│ │ └── verification
│ │ ├── block_number_monitor.go
│ │ ├── block_number_monitor_test.go
│ │ ├── cert_verifier.go
│ │ ├── commitment_utils.go
│ │ ├── commitment_utils_test.go
│ │ ├── errors.go
│ │ ├── router_cert_verifier_address_provider.go
│ │ ├── static_cert_verifier_address_provider.go
│ │ └── test
│ │ └── test_cert_verifier_address_provider.go
├── constants.go
├── errors.go
├── errors_test.go
├── grpc
│ ├── churner
│ │ ├── churner.pb.go
│ │ └── churner_grpc.pb.go
│ ├── common
│ │ ├── common.pb.go
│ │ └── v2
│ │ │ └── common_v2.pb.go
│ ├── disperser
│ │ ├── disperser.pb.go
│ │ ├── disperser_grpc.pb.go
│ │ └── v2
│ │ │ ├── disperser_v2.pb.go
│ │ │ ├── disperser_v2_grpc.pb.go
│ │ │ └── mock
│ │ │ └── disperser_mock.go
│ ├── encoder
│ │ ├── encoder.pb.go
│ │ ├── encoder_grpc.pb.go
│ │ └── v2
│ │ │ ├── encoder_v2.pb.go
│ │ │ └── encoder_v2_grpc.pb.go
│ ├── mock
│ │ ├── disperser.go
│ │ └── node_disperser_client.go
│ ├── node
│ │ ├── node.pb.go
│ │ └── node_grpc.pb.go
│ ├── relay
│ │ ├── relay.pb.go
│ │ └── relay_grpc.pb.go
│ ├── retriever
│ │ ├── retriever.pb.go
│ │ ├── retriever_grpc.pb.go
│ │ └── v2
│ │ │ ├── retriever_v2.pb.go
│ │ │ └── retriever_v2_grpc.pb.go
│ └── validator
│ │ ├── node_v2.pb.go
│ │ └── node_v2_grpc.pb.go
├── hashing
│ ├── node_hashing.go
│ ├── payment_state_hashing.go
│ ├── relay_hashing.go
│ └── utils.go
└── proto
│ ├── README.md
│ ├── churner
│ └── churner.proto
│ ├── common
│ ├── common.proto
│ └── v2
│ │ └── common_v2.proto
│ ├── disperser
│ ├── disperser.proto
│ └── v2
│ │ └── disperser_v2.proto
│ ├── encoder
│ ├── encoder.proto
│ └── v2
│ │ └── encoder_v2.proto
│ ├── node
│ └── node.proto
│ ├── relay
│ └── relay.proto
│ ├── retriever
│ ├── retriever.proto
│ └── v2
│ │ └── retriever_v2.proto
│ └── validator
│ └── node_v2.proto
├── common
├── abi.go
├── abis
│ └── EigenDAServiceManager.json
├── aws
│ ├── cli.go
│ ├── dynamodb
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── utils
│ │ │ └── test_utils.go
│ │ └── utils_test.go
│ ├── kms.go
│ ├── kms_fuzz_test.go
│ ├── mock
│ │ ├── dynamodb_client.go
│ │ └── s3_client.go
│ ├── s3
│ │ ├── client.go
│ │ ├── fragment.go
│ │ ├── fragment_test.go
│ │ ├── s3.go
│ │ └── scoped_keys.go
│ ├── secretmanager
│ │ └── secretmanager.go
│ └── test
│ │ └── client_test.go
├── cache
│ ├── cache.go
│ ├── cache_metrics.go
│ ├── fifo_cache.go
│ ├── fifo_cache_test.go
│ └── thread_safe_cache.go
├── common.go
├── common_test.go
├── deterministic_rand.go
├── ethclient.go
├── fireblocks_config.go
├── geth
│ ├── cli.go
│ ├── client.go
│ ├── failover.go
│ ├── handle_error.go
│ ├── instrumented_client.go
│ ├── multihoming_client.go
│ └── multihoming_client_test.go
├── healthcheck
│ ├── heartbeat.go
│ ├── heartbeat_test.go
│ └── server.go
├── index_lock.go
├── kms_wallet_config.go
├── kvstore
│ ├── batch.go
│ ├── key.go
│ ├── leveldb
│ │ ├── leveldb_store.go
│ │ └── metrics.go
│ ├── mapstore
│ │ └── map_store.go
│ ├── store.go
│ ├── table.go
│ ├── tablestore
│ │ ├── config.go
│ │ ├── key_test.go
│ │ ├── table_store.go
│ │ ├── table_store_batch.go
│ │ ├── table_store_builder.go
│ │ ├── table_store_iterator.go
│ │ ├── table_store_keys.go
│ │ ├── table_store_test.go
│ │ ├── ttl_test.go
│ │ └── util.go
│ └── test
│ │ ├── store_performance_test.go
│ │ ├── store_test.go
│ │ └── table_as_a_store.go
├── logger_config.go
├── memory
│ ├── Dockerfile.memtest
│ ├── memory.go
│ ├── memory_test.go
│ └── run_memory_test.sh
├── mock
│ ├── ethclient.go
│ ├── ratelimiter.go
│ ├── rpc_ethclient.go
│ └── workerpool.go
├── param_store.go
├── pprof
│ └── server.go
├── pubip
│ ├── mock_provider.go
│ ├── multi_provider.go
│ ├── pubip.go
│ ├── pubip_test.go
│ └── simple_provider.go
├── ratelimit.go
├── ratelimit
│ ├── limiter.go
│ ├── limiter_cli.go
│ └── ratelimit_test.go
├── ratelimit_test.go
├── read_only_map.go
├── read_only_map_test.go
├── replay
│ ├── no_op_replay_gaurdian.go
│ ├── replay_gaurdian.go
│ ├── replay_gaurdian_test.go
│ └── replay_guardian_impl.go
├── rpc_ethclient.go
├── stage_timer.go
├── store
│ ├── dynamo_store.go
│ ├── dynamo_store_test.go
│ ├── local_store.go
│ └── local_store_test.go
├── testutils
│ ├── random
│ │ ├── test_random.go
│ │ └── test_random_test.go
│ ├── size_of.go
│ ├── test_utils.go
│ └── test_utils_test.go
└── workerpool.go
├── contracts
├── .dockerignore
├── .gitignore
├── Dockerfile
├── Makefile
├── README.md
├── bindings
│ ├── AVSDirectory
│ │ └── binding.go
│ ├── BLSApkRegistry
│ │ └── binding.go
│ ├── BN254
│ │ └── binding.go
│ ├── BitmapUtils
│ │ └── binding.go
│ ├── DelegationManager
│ │ └── binding.go
│ ├── EigenDACertVerifier
│ │ └── binding.go
│ ├── EigenDACertVerifierRouter
│ │ └── binding.go
│ ├── EigenDACertVerifierV1
│ │ └── binding.go
│ ├── EigenDACertVerifierV2
│ │ └── binding.go
│ ├── EigenDADisperserRegistry
│ │ └── binding.go
│ ├── EigenDARelayRegistry
│ │ └── binding.go
│ ├── EigenDAServiceManager
│ │ └── binding.go
│ ├── EigenDAStateRetriever
│ │ └── binding.go
│ ├── EigenDAThresholdRegistry
│ │ └── binding.go
│ ├── EjectionManager
│ │ └── binding.go
│ ├── IEigenDACertTypeBindings
│ │ └── binding.go
│ ├── IEigenDACertVerifierLegacy
│ │ └── binding.go
│ ├── IEigenDARelayRegistry
│ │ └── binding.go
│ ├── IEigenDAServiceManager
│ │ └── binding.go
│ ├── IIndexRegistry
│ │ └── binding.go
│ ├── MockRollup
│ │ └── binding.go
│ ├── OperatorStateRetriever
│ │ └── binding.go
│ ├── PaymentVault
│ │ └── binding.go
│ ├── RegistryCoordinator
│ │ └── binding.go
│ ├── SocketRegistry
│ │ └── binding.go
│ └── StakeRegistry
│ │ └── binding.go
├── compile.sh
├── foundry.toml
├── package.json
├── remappings.txt
├── script
│ ├── DeployOpenEigenLayer.s.sol
│ ├── EigenDADeployer.s.sol
│ ├── EigenLayerUtils.s.sol
│ ├── EjectionManagerDeployer.s.sol
│ ├── GenerateUnitTestHashes.s.sol
│ ├── SetUpEigenDA.s.sol
│ ├── deploy
│ │ ├── certverifier
│ │ │ ├── CertVerifierDeployerV1.s.sol
│ │ │ ├── CertVerifierDeployerV2.s.sol
│ │ │ ├── README.md
│ │ │ ├── config
│ │ │ │ ├── holesky
│ │ │ │ │ ├── preprod.config.json
│ │ │ │ │ └── testnet.config.json
│ │ │ │ └── sepolia
│ │ │ │ │ └── testnet.config.json
│ │ │ └── output
│ │ │ │ └── h.txt
│ │ ├── existing
│ │ │ ├── GV2_deployment_2024_6_2.json
│ │ │ ├── GV2_preprod_deployment_2024_30_1.json
│ │ │ ├── Holesky_preprod.json
│ │ │ ├── Holesky_testnet.json
│ │ │ ├── M1_deployment_goerli_2023_3_23.json
│ │ │ └── M2_from_scratch_deployment_data.json
│ │ ├── goerliv2
│ │ │ ├── GoerliV2_Deploy.s.sol
│ │ │ ├── config
│ │ │ │ ├── preprod.config.json
│ │ │ │ └── prod.config.json
│ │ │ └── output
│ │ │ │ ├── GV2_preprod_deployment_data.json
│ │ │ │ └── GV2_prod_deployment_data.json
│ │ ├── holesky
│ │ │ ├── EigenDASM_RewardsUpgrade.s.sol
│ │ │ ├── Holesky_Deploy.s.sol
│ │ │ ├── config
│ │ │ │ ├── eigenlayer_preprod.config.json
│ │ │ │ ├── eigenlayer_preprod_addresses.config.json
│ │ │ │ ├── ejector.config.json
│ │ │ │ ├── preprod.config.json
│ │ │ │ └── testnet.config.json
│ │ │ └── output
│ │ │ │ ├── holesky_preprod_deployment_data.json
│ │ │ │ └── holesky_testnet_deployment_data.json
│ │ ├── m2
│ │ │ ├── M2_Deploy.s.sol
│ │ │ ├── config
│ │ │ │ ├── M2_deploy.config.json
│ │ │ │ └── M2_preprod_deploy.config.json
│ │ │ └── output
│ │ │ │ └── M2_preprod_deployment_data.json
│ │ ├── mainnet
│ │ │ ├── Mainnet_Deploy.s.sol
│ │ │ ├── config
│ │ │ │ ├── ejector.config.json
│ │ │ │ ├── mainnet.config.json
│ │ │ │ └── mainnet_addresses.json
│ │ │ └── output
│ │ │ │ └── mainnet_deployment_data.json
│ │ ├── router
│ │ │ ├── CertVerifierRouterDeployer.s.sol
│ │ │ ├── README.md
│ │ │ └── config
│ │ │ │ └── example_config.json
│ │ └── verifiable
│ │ │ ├── DeployVerifiable.s.sol
│ │ │ ├── DeploymentInitializer.sol
│ │ │ ├── DeploymentTypes.sol
│ │ │ ├── PrintMultisigCalldata.s.sol
│ │ │ ├── config
│ │ │ └── placeholder.config.toml
│ │ │ ├── doc
│ │ │ └── DEPLOY.md
│ │ │ ├── mocks
│ │ │ ├── MockRegistryCoordinator.sol
│ │ │ └── MockStakeRegistry.sol
│ │ │ └── test
│ │ │ └── BeforeVerifiableDeploymentInitialization.s.sol
│ └── input
│ │ └── .gitkeep
├── src
│ ├── Imports.sol
│ ├── core
│ │ ├── EigenDADisperserRegistry.sol
│ │ ├── EigenDADisperserRegistryStorage.sol
│ │ ├── EigenDARelayRegistry.sol
│ │ ├── EigenDARelayRegistryStorage.sol
│ │ ├── EigenDAServiceManager.sol
│ │ ├── EigenDAServiceManagerStorage.sol
│ │ ├── EigenDAThresholdRegistry.sol
│ │ ├── EigenDAThresholdRegistryStorage.sol
│ │ ├── PaymentVault.sol
│ │ ├── PaymentVaultStorage.sol
│ │ ├── interfaces
│ │ │ ├── IEigenDABatchMetadataStorage.sol
│ │ │ ├── IEigenDADisperserRegistry.sol
│ │ │ ├── IEigenDARelayRegistry.sol
│ │ │ ├── IEigenDAServiceManager.sol
│ │ │ ├── IEigenDASignatureVerifier.sol
│ │ │ ├── IEigenDAThresholdRegistry.sol
│ │ │ └── IPaymentVault.sol
│ │ └── libraries
│ │ │ ├── v1
│ │ │ └── EigenDATypesV1.sol
│ │ │ └── v2
│ │ │ └── EigenDATypesV2.sol
│ └── periphery
│ │ └── cert
│ │ ├── EigenDACertTypes.sol
│ │ ├── EigenDACertVerifier.sol
│ │ ├── interfaces
│ │ ├── IEigenDACertTypeBindings.sol
│ │ ├── IEigenDACertVerifier.sol
│ │ ├── IEigenDACertVerifierBase.sol
│ │ ├── IEigenDACertVerifierRouter.sol
│ │ └── IVersionedEigenDACertVerifier.sol
│ │ ├── legacy
│ │ ├── IEigenDACertVerifierLegacy.sol
│ │ ├── v1
│ │ │ ├── EigenDACertVerificationV1Lib.sol
│ │ │ └── EigenDACertVerifierV1.sol
│ │ └── v2
│ │ │ ├── EigenDACertVerificationV2Lib.sol
│ │ │ └── EigenDACertVerifierV2.sol
│ │ ├── libraries
│ │ └── EigenDACertVerificationLib.sol
│ │ └── router
│ │ └── EigenDACertVerifierRouter.sol
└── test
│ ├── MockEigenDADeployer.sol
│ └── unit
│ ├── EigenDABlobUtilsV1Unit.t.sol
│ ├── EigenDACertVerifierRouterUnit.t.sol
│ ├── EigenDACertVerifierV2Unit.t.sol
│ ├── EigenDADisperserRegistryUnit.t.sol
│ ├── EigenDARelayRegistryUnit.t.sol
│ ├── EigenDAServiceManagerUnit.t.sol
│ ├── EigenDAThresholdRegistryUnit.t.sol
│ └── PaymentVaultUnit.t.sol
├── core
├── aggregation.go
├── aggregation_test.go
├── assignment.go
├── assignment_test.go
├── attestation.go
├── auth.go
├── auth
│ ├── auth_test.go
│ ├── authenticator.go
│ ├── signer.go
│ └── v2
│ │ ├── auth_test.go
│ │ ├── authenticator.go
│ │ ├── signer.go
│ │ └── signer_test.go
├── bn254
│ └── attestation.go
├── chainio.go
├── data.go
├── data_test.go
├── eth
│ ├── reader.go
│ ├── state.go
│ ├── utils.go
│ └── writer.go
├── indexer
│ ├── errors.go
│ ├── indexer.go
│ ├── indexer_suite_test.go
│ ├── operator_pubkeys.go
│ ├── operator_pubkeys_filterer.go
│ ├── operator_sockets.go
│ ├── operator_sockets_filterer.go
│ ├── state.go
│ ├── state_test.go
│ └── upgrader.go
├── meterer
│ ├── dynamodb_metering_store.go
│ ├── dynamodb_metering_store_test.go
│ ├── meterer.go
│ ├── meterer_test.go
│ ├── metering_store.go
│ ├── onchain_state.go
│ ├── onchain_state_test.go
│ └── util.go
├── mock
│ ├── indexed_state.go
│ ├── operator_sockets_filterer.go
│ ├── payment_state.go
│ ├── state.go
│ ├── v2
│ │ └── validator.go
│ ├── validator.go
│ └── writer.go
├── ntp.go
├── serialization.go
├── serialization_test.go
├── state.go
├── state_test.go
├── test
│ └── core_test.go
├── thegraph
│ ├── config.go
│ ├── querier.go
│ ├── querier_test.go
│ ├── state.go
│ ├── state_integration_test.go
│ └── state_test.go
├── utils.go
├── v2
│ ├── assignment.go
│ ├── assignment_test.go
│ ├── auth.go
│ ├── blob_params.go
│ ├── core_test.go
│ ├── errors.go
│ ├── serialization.go
│ ├── serialization_test.go
│ ├── types.go
│ ├── types_test.go
│ └── validator.go
└── validator.go
├── crypto
└── ecc
│ └── bn254
│ ├── attestation.go
│ └── utils.go
├── disperser
├── .gitignore
├── Makefile
├── apiserver
│ ├── config.go
│ ├── disperse_blob_v2.go
│ ├── get_blob_status_v2.go
│ ├── metrics_v2.go
│ ├── ratelimit_test.go
│ ├── server.go
│ ├── server_test.go
│ ├── server_v2.go
│ └── server_v2_test.go
├── batcher
│ ├── batcher.go
│ ├── batcher_test.go
│ ├── encoded_blob_store.go
│ ├── encoding_streamer.go
│ ├── encoding_streamer_test.go
│ ├── finalizer.go
│ ├── finalizer_test.go
│ ├── grpc
│ │ └── dispatcher.go
│ ├── metrics.go
│ ├── mock
│ │ ├── finalizer.go
│ │ └── txn_manager.go
│ ├── txn_manager.go
│ └── txn_manager_test.go
├── cmd
│ ├── apiserver
│ │ ├── config.go
│ │ ├── flags
│ │ │ └── flags.go
│ │ └── main.go
│ ├── batcher
│ │ ├── config.go
│ │ ├── flags
│ │ │ └── flags.go
│ │ └── main.go
│ ├── controller
│ │ ├── config.go
│ │ ├── flags
│ │ │ └── flags.go
│ │ └── main.go
│ ├── dataapi
│ │ ├── config.go
│ │ ├── docs
│ │ │ └── docs.go
│ │ ├── flags
│ │ │ └── flags.go
│ │ └── main.go
│ └── encoder
│ │ ├── config.go
│ │ ├── flags
│ │ └── flags.go
│ │ ├── icicle.Dockerfile
│ │ └── main.go
├── common
│ ├── blobstore
│ │ ├── blob_metadata_store.go
│ │ ├── blob_metadata_store_test.go
│ │ ├── blobstore_test.go
│ │ ├── shared_storage.go
│ │ └── shared_storage_test.go
│ ├── errors.go
│ ├── inmem
│ │ ├── store.go
│ │ └── store_test.go
│ ├── semver
│ │ └── semver.go
│ ├── utils.go
│ └── v2
│ │ ├── blob.go
│ │ └── blobstore
│ │ ├── blobstore_test.go
│ │ ├── dynamo_metadata_store.go
│ │ ├── dynamo_metadata_store_test.go
│ │ ├── errors.go
│ │ ├── instrumented_metadata_store.go
│ │ ├── metadata_store.go
│ │ ├── s3_blob_store.go
│ │ └── s3_blob_store_test.go
├── controller
│ ├── blob_set.go
│ ├── blob_set_test.go
│ ├── controller_test.go
│ ├── dispatcher.go
│ ├── dispatcher_metrics.go
│ ├── dispatcher_test.go
│ ├── encoding_manager.go
│ ├── encoding_manager_metrics.go
│ ├── encoding_manager_test.go
│ ├── mock_blob_set.go
│ ├── mock_node_client_manager.go
│ ├── node_client_manager.go
│ ├── node_client_manager_test.go
│ ├── recover_state.go
│ ├── recover_state_test.go
│ ├── signature_receiver.go
│ └── signature_receiver_test.go
├── dataapi
│ ├── Makefile
│ ├── blobs_handlers.go
│ ├── config.go
│ ├── docs
│ │ ├── v1
│ │ │ ├── V1_docs.go
│ │ │ ├── V1_swagger.json
│ │ │ └── V1_swagger.yaml
│ │ └── v2
│ │ │ ├── V2_docs.go
│ │ │ ├── V2_swagger.json
│ │ │ └── V2_swagger.yaml
│ ├── feed_cache_metrics.go
│ ├── grpc_service_availability_handler.go
│ ├── http_service_availability_handler.go
│ ├── metrics.go
│ ├── metrics_handler.go
│ ├── metrics_handlers.go
│ ├── nonsigner_handler.go
│ ├── nonsigner_utils.go
│ ├── nonsigner_utils_test.go
│ ├── operator_handler.go
│ ├── prometheus
│ │ ├── api.go
│ │ ├── config.go
│ │ └── mock
│ │ │ └── api.go
│ ├── prometheus_client.go
│ ├── queried_operators_handlers.go
│ ├── server.go
│ ├── server_test.go
│ ├── subgraph
│ │ ├── api.go
│ │ ├── mock
│ │ │ └── api.go
│ │ └── queries.go
│ ├── subgraph_client.go
│ ├── subgraph_client_test.go
│ ├── testdata
│ │ ├── prometheus-resp-avg-throughput.json
│ │ └── prometheus-response-sample.json
│ ├── utils.go
│ └── v2
│ │ ├── accounts.go
│ │ ├── batches.go
│ │ ├── blobs.go
│ │ ├── circular_queue.go
│ │ ├── circular_queue_test.go
│ │ ├── feed_cache.go
│ │ ├── feed_cache_test.go
│ │ ├── metrics.go
│ │ ├── operators.go
│ │ ├── server_v2.go
│ │ ├── server_v2_test.go
│ │ ├── swagger.go
│ │ ├── testdata
│ │ ├── prometheus-resp-avg-throughput.json
│ │ ├── prometheus-response-network-signing-rate.json
│ │ └── prometheus-response-sample.json
│ │ └── types.go
├── disperser.go
├── encoder
│ ├── client.go
│ ├── client_v2.go
│ ├── config.go
│ ├── metrics.go
│ ├── server.go
│ ├── server_test.go
│ ├── server_v2.go
│ ├── server_v2_test.go
│ └── setup_test.go
├── encoder_client.go
├── encoder_client_v2.go
├── local_encoder_client.go
├── metrics.go
├── mock
│ ├── dispatcher.go
│ ├── encoder.go
│ └── encoder_v2.go
└── server_config.go
├── docker-bake.hcl
├── docs
├── audits
│ └── Sigma_Prime_EigenDA_Offchain_Security_Assessment_Report.pdf
├── contributing.md
└── spec
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── book.toml
│ ├── mermaid-init.js
│ ├── mermaid.min.js
│ └── src
│ ├── SUMMARY.md
│ ├── assets
│ ├── architecture.png
│ ├── assignment-module.png
│ ├── attestation-layer-parts.png
│ ├── attestation-layer.png
│ ├── blazar-diagram.png
│ ├── bridging-module.png
│ ├── encoding-groups.png
│ ├── encoding-module.png
│ ├── integration
│ │ ├── blob-certificate.png
│ │ ├── cert-rbn-recency-window.png
│ │ ├── contracts-eigenda.png
│ │ ├── contracts-rollup.png
│ │ ├── high-level-diagram.png
│ │ ├── op-integration-high-level.png
│ │ ├── payload-to-blob-encoding.png
│ │ ├── recency-window-timeline.png
│ │ ├── rollup-proxy-da-integration.png
│ │ ├── ultra-high-res-diagram.png
│ │ ├── v2-batch-hashing-structure.png
│ │ └── v2-cert.png
│ └── network-layer.png
│ ├── integration.md
│ ├── integration
│ ├── rollup-stacks.md
│ ├── rollup-stacks
│ │ └── 1-op-secure-integration-workflow.md
│ ├── spec.md
│ └── spec
│ │ ├── 1-apis.md
│ │ ├── 2-rollup-payload-lifecycle.md
│ │ ├── 3-datastructs.md
│ │ ├── 4-contracts.md
│ │ ├── 5-lifecycle-phases.md
│ │ └── 6-secure-integration.md
│ ├── introduction.md
│ ├── protobufs
│ └── generated
│ │ ├── churner.md
│ │ ├── common.md
│ │ ├── common_v2.md
│ │ ├── disperser.md
│ │ ├── disperser_v2.md
│ │ ├── eigenda-protos.md
│ │ ├── encoder.md
│ │ ├── encoder_v2.md
│ │ ├── node.md
│ │ ├── node_v2.md
│ │ ├── relay.md
│ │ ├── retriever.md
│ │ └── retriever_v2.md
│ ├── protocol.md
│ ├── protocol
│ ├── architecture.md
│ ├── architecture
│ │ ├── amortized-proving.md
│ │ ├── assignment.md
│ │ ├── bridging.md
│ │ └── encoding.md
│ └── contracts.md
│ └── v1.md
├── encoding
├── backend.go
├── bench
│ ├── Makefile
│ └── main.go
├── constants.go
├── data.go
├── encoding.go
├── fft
│ ├── errors.go
│ ├── fft.go
│ ├── fft_fr.go
│ ├── fft_fr_test.go
│ ├── fft_g1.go
│ ├── recover_from_samples.go
│ ├── recover_from_samples_test.go
│ ├── zero_poly.go
│ └── zero_poly_test.go
├── icicle
│ ├── device_setup.go
│ ├── msm_setup.go
│ ├── ntt_setup.go
│ └── utils.go
├── kzg
│ ├── cli.go
│ ├── constants.go
│ ├── kzg.go
│ ├── kzgrs.go
│ ├── pointsIO.go
│ ├── prover
│ │ ├── decode.go
│ │ ├── decode_test.go
│ │ ├── gnark
│ │ │ ├── commitments.go
│ │ │ └── multiframe_proof.go
│ │ ├── icicle.go
│ │ ├── icicle
│ │ │ ├── ecntt.go
│ │ │ ├── msm.go
│ │ │ └── multiframe_proof.go
│ │ ├── noicicle.go
│ │ ├── parametrized_prover.go
│ │ ├── parametrized_prover_test.go
│ │ ├── precompute.go
│ │ ├── precompute_test.go
│ │ ├── proof_backend.go
│ │ ├── prover.go
│ │ ├── prover_fuzz_test.go
│ │ └── prover_test.go
│ ├── setup.go
│ ├── srs.go
│ └── verifier
│ │ ├── batch_commit_equivalence.go
│ │ ├── batch_commit_equivalence_test.go
│ │ ├── frame_test.go
│ │ ├── length_test.go
│ │ ├── multiframe.go
│ │ ├── multiframe_test.go
│ │ ├── verifier.go
│ │ └── verifier_test.go
├── mock
│ └── encoder.go
├── params.go
├── rs
│ ├── bundle_builder.go
│ ├── bundle_builder_test.go
│ ├── decode.go
│ ├── encode.go
│ ├── encode_test.go
│ ├── encoder.go
│ ├── encoder_fuzz_test.go
│ ├── encoder_suite_test.go
│ ├── frame_coeffs.go
│ ├── frame_coeffs_test.go
│ ├── frame_proofs.go
│ ├── frame_proofs_test.go
│ ├── gnark
│ │ └── extend_poly.go
│ ├── icicle.go
│ ├── icicle
│ │ └── extend_poly.go
│ ├── interpolation.go
│ ├── noicicle.go
│ ├── parametrized_encoder.go
│ ├── params.go
│ ├── utils.go
│ └── utils_test.go
├── serialization.go
├── serialization_test.go
├── test
│ ├── README.md
│ ├── main.go
│ ├── testCrypto.go
│ └── testKzgBn254.go
├── test_utils.go
├── utils.go
├── utils
│ ├── codec
│ │ ├── README.md
│ │ ├── codec.go
│ │ └── test
│ │ │ └── codec_test.go
│ ├── openCommitment
│ │ ├── open_commitment.go
│ │ └── open_commitment_test.go
│ ├── reverseBits
│ │ └── reverseBits.go
│ └── toeplitz
│ │ ├── cir.go
│ │ ├── cir_test.go
│ │ ├── toeplitz.go
│ │ └── toeplitz_test.go
└── utils_test.go
├── go.mod
├── go.sum
├── inabox
├── .gitignore
├── AnvilStateGen_README.md
├── Makefile
├── README.md
├── anvil
│ └── docker-compose.yaml
├── bin.sh
├── create-s3-bucket.sh
├── deploy
│ ├── cmd
│ │ └── main.go
│ ├── codegen
│ │ ├── gen.sh
│ │ └── main.go
│ ├── config.go
│ ├── config_types.go
│ ├── deploy.go
│ ├── env_vars.go
│ ├── localstack.go
│ ├── subgraph.go
│ └── utils.go
├── geth
│ ├── .env
│ ├── .gitignore
│ ├── docker-compose.yml
│ ├── genesis.json
│ ├── get-revert.sh
│ ├── run.sh
│ ├── scripts
│ │ └── gen-gensis-config.py
│ ├── secret
│ │ └── geth-account-password
│ └── setup.sh
├── grafana-agent
│ └── agent-config.yaml
├── node-plugin.sh
├── ratelimit.sh
├── resources
│ └── kzg
│ │ ├── g1.point
│ │ ├── g1.point.300000
│ │ ├── g2.point
│ │ ├── g2.point.300000
│ │ ├── g2.point.300000.powerOf2
│ │ └── g2.point.powerOf2
├── secrets
│ ├── bls_keys
│ │ ├── keys
│ │ │ ├── 1.bls.key.json
│ │ │ ├── 10.bls.key.json
│ │ │ ├── 11.bls.key.json
│ │ │ ├── 12.bls.key.json
│ │ │ ├── 13.bls.key.json
│ │ │ ├── 14.bls.key.json
│ │ │ ├── 15.bls.key.json
│ │ │ ├── 16.bls.key.json
│ │ │ ├── 17.bls.key.json
│ │ │ ├── 18.bls.key.json
│ │ │ ├── 19.bls.key.json
│ │ │ ├── 2.bls.key.json
│ │ │ ├── 20.bls.key.json
│ │ │ ├── 21.bls.key.json
│ │ │ ├── 22.bls.key.json
│ │ │ ├── 23.bls.key.json
│ │ │ ├── 24.bls.key.json
│ │ │ ├── 25.bls.key.json
│ │ │ ├── 26.bls.key.json
│ │ │ ├── 27.bls.key.json
│ │ │ ├── 28.bls.key.json
│ │ │ ├── 29.bls.key.json
│ │ │ ├── 3.bls.key.json
│ │ │ ├── 30.bls.key.json
│ │ │ ├── 31.bls.key.json
│ │ │ ├── 32.bls.key.json
│ │ │ ├── 4.bls.key.json
│ │ │ ├── 5.bls.key.json
│ │ │ ├── 6.bls.key.json
│ │ │ ├── 7.bls.key.json
│ │ │ ├── 8.bls.key.json
│ │ │ └── 9.bls.key.json
│ │ ├── password.txt
│ │ └── private_key_hex.txt
│ ├── ecdsa_keys
│ │ ├── keys
│ │ │ ├── 1.ecdsa.key.json
│ │ │ ├── 10.ecdsa.key.json
│ │ │ ├── 11.ecdsa.key.json
│ │ │ ├── 12.ecdsa.key.json
│ │ │ ├── 13.ecdsa.key.json
│ │ │ ├── 14.ecdsa.key.json
│ │ │ ├── 15.ecdsa.key.json
│ │ │ ├── 16.ecdsa.key.json
│ │ │ ├── 17.ecdsa.key.json
│ │ │ ├── 18.ecdsa.key.json
│ │ │ ├── 19.ecdsa.key.json
│ │ │ ├── 2.ecdsa.key.json
│ │ │ ├── 20.ecdsa.key.json
│ │ │ ├── 21.ecdsa.key.json
│ │ │ ├── 22.ecdsa.key.json
│ │ │ ├── 23.ecdsa.key.json
│ │ │ ├── 24.ecdsa.key.json
│ │ │ ├── 25.ecdsa.key.json
│ │ │ ├── 26.ecdsa.key.json
│ │ │ ├── 27.ecdsa.key.json
│ │ │ ├── 28.ecdsa.key.json
│ │ │ ├── 29.ecdsa.key.json
│ │ │ ├── 3.ecdsa.key.json
│ │ │ ├── 30.ecdsa.key.json
│ │ │ ├── 31.ecdsa.key.json
│ │ │ ├── 32.ecdsa.key.json
│ │ │ ├── 4.ecdsa.key.json
│ │ │ ├── 5.ecdsa.key.json
│ │ │ ├── 6.ecdsa.key.json
│ │ │ ├── 7.ecdsa.key.json
│ │ │ ├── 8.ecdsa.key.json
│ │ │ └── 9.ecdsa.key.json
│ │ ├── password.txt
│ │ └── private_key_hex.txt
│ └── keys_for_200_operators.zip
├── templates
│ ├── testconfig-anvil-docker.yaml
│ ├── testconfig-anvil-nochurner.yaml
│ ├── testconfig-anvil-nograph.yaml
│ ├── testconfig-anvil.yaml
│ ├── testconfig-docker-anvil.yaml
│ └── testconfig-geth.yaml
├── tests
│ ├── integration_suite_test.go
│ ├── integration_test.go
│ ├── integration_v2_test.go
│ └── ratelimit_test.go
├── thegraph
│ └── docker-compose.yml
└── wait-for
├── indexer
├── accumulator.go
├── cli.go
├── config.go
├── eth
│ ├── header_service.go
│ └── header_service_test.go
├── filterer.go
├── header.go
├── header_service.go
├── header_store.go
├── indexer.go
├── inmem
│ ├── encoding.go
│ ├── header_store.go
│ ├── header_store_test.go
│ └── testdata
│ │ ├── fork1.json
│ │ └── fork2.json
├── leveldb
│ ├── encoding.go
│ ├── header_store.go
│ ├── header_store_test.go
│ ├── leveldb.go
│ ├── schema.go
│ └── testdata
│ │ ├── fork1.json
│ │ ├── fork2.json
│ │ └── headers.json
├── mock
│ └── indexer.go
├── test
│ ├── accumulator.go
│ ├── accumulator
│ │ ├── accumulator.go
│ │ ├── bindings
│ │ │ └── binding.go
│ │ └── filterer.go
│ ├── contracts
│ │ ├── WETH9.abi
│ │ ├── WETH9.bin
│ │ ├── Weth.go
│ │ └── weth.sol
│ ├── filterer.go
│ ├── indexer_test.go
│ ├── mock
│ │ ├── chain.json
│ │ ├── contract_simulator.go
│ │ ├── contract_simulator_test.go
│ │ └── simulated_backend.go
│ └── upgrader.go
├── upgrader
│ └── upgrader.go
└── upgrades.go
├── litt
├── README.md
├── cache
│ └── cached_table.go
├── db.go
├── disktable
│ ├── control_loop.go
│ ├── control_loop_messages.go
│ ├── disk_table.go
│ ├── disk_table_flush_loop.go
│ ├── disk_table_test.go
│ ├── flush_loop.go
│ ├── flush_loop_messages.go
│ ├── keymap
│ │ ├── keymap.go
│ │ ├── keymap_test.go
│ │ ├── keymap_type.go
│ │ ├── keymap_type_file.go
│ │ ├── level_db_keymap.go
│ │ └── mem_keymap.go
│ ├── segment
│ │ ├── address_test.go
│ │ ├── key_file.go
│ │ ├── key_file_test.go
│ │ ├── metadata_file.go
│ │ ├── metadata_file_test.go
│ │ ├── segment.go
│ │ ├── segment_scanner.go
│ │ ├── segment_test.go
│ │ ├── segment_version.go
│ │ ├── value_file.go
│ │ └── value_file_test.go
│ └── table_metadata.go
├── littbuilder
│ ├── build_utils.go
│ └── db_impl.go
├── littdb_config.go
├── memtable
│ └── mem_table.go
├── metrics
│ └── littdb_metrics.go
├── resources
│ ├── flush-visual.png
│ ├── iDidIt.png
│ ├── iteration1.png
│ ├── iteration2.png
│ ├── iteration3.png
│ ├── iteration4.png
│ ├── iteration5.png
│ ├── iteration6.png
│ ├── iteration7.png
│ ├── iteration8.png
│ ├── iteration9.png
│ ├── littdb-big-picture.png
│ └── littdb-logo.png
├── table.go
├── test
│ ├── cache_test.go
│ ├── db_test.go
│ ├── generate_example_tree_test.go
│ ├── keymap_migration_test.go
│ ├── migration_data.go
│ ├── migration_test.go
│ ├── table_test.go
│ └── testdata
│ │ ├── v0
│ │ └── test
│ │ │ ├── keymap
│ │ │ ├── data
│ │ │ │ ├── 000001.log
│ │ │ │ ├── CURRENT
│ │ │ │ ├── LOCK
│ │ │ │ ├── LOG
│ │ │ │ └── MANIFEST-000000
│ │ │ ├── initialized
│ │ │ └── keymap-type.txt
│ │ │ ├── segments
│ │ │ ├── 0-0.values
│ │ │ ├── 0-1.values
│ │ │ ├── 0-2.values
│ │ │ ├── 0-3.values
│ │ │ ├── 0.keys
│ │ │ ├── 0.metadata
│ │ │ ├── 1-0.values
│ │ │ ├── 1-1.values
│ │ │ ├── 1-2.values
│ │ │ ├── 1-3.values
│ │ │ ├── 1.keys
│ │ │ ├── 1.metadata
│ │ │ ├── 2-0.values
│ │ │ ├── 2-1.values
│ │ │ ├── 2-2.values
│ │ │ ├── 2-3.values
│ │ │ ├── 2.keys
│ │ │ ├── 2.metadata
│ │ │ ├── 3-0.values
│ │ │ ├── 3-1.values
│ │ │ ├── 3-2.values
│ │ │ ├── 3-3.values
│ │ │ ├── 3.keys
│ │ │ ├── 3.metadata
│ │ │ ├── 4-0.values
│ │ │ ├── 4-1.values
│ │ │ ├── 4-2.values
│ │ │ ├── 4-3.values
│ │ │ ├── 4.keys
│ │ │ ├── 4.metadata
│ │ │ ├── 5-0.values
│ │ │ ├── 5-1.values
│ │ │ ├── 5-2.values
│ │ │ ├── 5-3.values
│ │ │ ├── 5.keys
│ │ │ ├── 5.metadata
│ │ │ ├── 6-0.values
│ │ │ ├── 6-1.values
│ │ │ ├── 6-2.values
│ │ │ ├── 6-3.values
│ │ │ ├── 6.keys
│ │ │ └── 6.metadata
│ │ │ └── table.metadata
│ │ ├── v1
│ │ └── test
│ │ │ ├── keymap
│ │ │ ├── data
│ │ │ │ ├── 000001.log
│ │ │ │ ├── CURRENT
│ │ │ │ ├── LOCK
│ │ │ │ ├── LOG
│ │ │ │ └── MANIFEST-000000
│ │ │ ├── initialized
│ │ │ └── keymap-type.txt
│ │ │ ├── segments
│ │ │ ├── 0-0.values
│ │ │ ├── 0-1.values
│ │ │ ├── 0-2.values
│ │ │ ├── 0-3.values
│ │ │ ├── 0.keys
│ │ │ ├── 0.metadata
│ │ │ ├── 1-0.values
│ │ │ ├── 1-1.values
│ │ │ ├── 1-2.values
│ │ │ ├── 1-3.values
│ │ │ ├── 1.keys
│ │ │ ├── 1.metadata
│ │ │ ├── 2-0.values
│ │ │ ├── 2-1.values
│ │ │ ├── 2-2.values
│ │ │ ├── 2-3.values
│ │ │ ├── 2.keys
│ │ │ ├── 2.metadata
│ │ │ ├── 3-0.values
│ │ │ ├── 3-1.values
│ │ │ ├── 3-2.values
│ │ │ ├── 3-3.values
│ │ │ ├── 3.keys
│ │ │ ├── 3.metadata
│ │ │ ├── 4-0.values
│ │ │ ├── 4-1.values
│ │ │ ├── 4-2.values
│ │ │ ├── 4-3.values
│ │ │ ├── 4.keys
│ │ │ ├── 4.metadata
│ │ │ ├── 5-0.values
│ │ │ ├── 5-1.values
│ │ │ ├── 5-2.values
│ │ │ ├── 5-3.values
│ │ │ ├── 5.keys
│ │ │ ├── 5.metadata
│ │ │ ├── 6-0.values
│ │ │ ├── 6-1.values
│ │ │ ├── 6-2.values
│ │ │ ├── 6-3.values
│ │ │ ├── 6.keys
│ │ │ └── 6.metadata
│ │ │ └── table.metadata
│ │ └── v2
│ │ └── test
│ │ ├── keymap
│ │ ├── data
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── initialized
│ │ └── keymap-type.txt
│ │ ├── segments
│ │ ├── 0-0.values
│ │ ├── 0-1.values
│ │ ├── 0-2.values
│ │ ├── 0-3.values
│ │ ├── 0.keys
│ │ ├── 0.metadata
│ │ ├── 1-0.values
│ │ ├── 1-1.values
│ │ ├── 1-2.values
│ │ ├── 1-3.values
│ │ ├── 1.keys
│ │ ├── 1.metadata
│ │ ├── 2-0.values
│ │ ├── 2-1.values
│ │ ├── 2-2.values
│ │ ├── 2-3.values
│ │ ├── 2.keys
│ │ ├── 2.metadata
│ │ ├── 3-0.values
│ │ ├── 3-1.values
│ │ ├── 3-2.values
│ │ ├── 3-3.values
│ │ ├── 3.keys
│ │ ├── 3.metadata
│ │ ├── 4-0.values
│ │ ├── 4-1.values
│ │ ├── 4-2.values
│ │ ├── 4-3.values
│ │ ├── 4.keys
│ │ ├── 4.metadata
│ │ ├── 5-0.values
│ │ ├── 5-1.values
│ │ ├── 5-2.values
│ │ ├── 5-3.values
│ │ ├── 5.keys
│ │ ├── 5.metadata
│ │ ├── 6-0.values
│ │ ├── 6-1.values
│ │ ├── 6-2.values
│ │ ├── 6-3.values
│ │ ├── 6.keys
│ │ ├── 6.metadata
│ │ ├── 7-0.values
│ │ ├── 7-1.values
│ │ ├── 7-2.values
│ │ ├── 7-3.values
│ │ ├── 7.keys
│ │ └── 7.metadata
│ │ └── table.metadata
├── types
│ ├── address.go
│ ├── kv_pair.go
│ └── scoped_key.go
└── util
│ ├── fatal_error_handler.go
│ ├── files.go
│ ├── files_test.go
│ ├── hashing.go
│ └── unsafe_string.go
├── mise.toml
├── node
├── .gitignore
├── Makefile
├── auth
│ ├── authenticator.go
│ ├── authenticator_test.go
│ ├── request_signing.go
│ ├── request_signing_test.go
│ └── request_signing_test_utils.go
├── churner_client.go
├── cmd
│ ├── main.go
│ └── resources
│ │ ├── nginx-ec2.conf
│ │ └── nginx-local.conf
├── config.go
├── database-paths.md
├── errors.go
├── flags
│ └── flags.go
├── grpc
│ ├── metrics_v2.go
│ ├── run.go
│ ├── server.go
│ ├── server_load_test.go
│ ├── server_test.go
│ ├── server_v2.go
│ └── server_v2_test.go
├── metrics.go
├── mock
│ ├── .keep
│ ├── churner_client.go
│ ├── store_v2.go
│ └── testdata.go
├── node.go
├── node_test.go
├── node_v2.go
├── node_v2_test.go
├── operator.go
├── operator_test.go
├── plugin
│ ├── cmd
│ │ └── main.go
│ ├── config.go
│ ├── tests
│ │ └── plugin_test.go
│ └── utils.go
├── store.go
├── store_test.go
├── store_utils.go
├── store_utils_test.go
├── utils.go
├── validator_store.go
├── validator_store_test.go
└── version.go
├── operators
├── churner
│ ├── Makefile
│ ├── churner.go
│ ├── churner_test.go
│ ├── cmd
│ │ └── main.go
│ ├── config.go
│ ├── flags
│ │ └── flags.go
│ ├── metrics.go
│ ├── server.go
│ ├── server_test.go
│ └── tests
│ │ └── churner_test.go
├── ejector
│ ├── ejector.go
│ └── metrics.go
└── utils.go
├── prometheus.yml
├── relay
├── Makefile
├── auth
│ ├── authenticator.go
│ ├── authenticator_test.go
│ ├── request_signing.go
│ └── request_signing_test.go
├── blob_provider.go
├── blob_provider_test.go
├── cache
│ ├── cache_accessor.go
│ ├── cache_accessor_metrics.go
│ └── cache_accessor_test.go
├── chunk_provider.go
├── chunk_provider_test.go
├── chunkstore
│ ├── chunk_reader.go
│ ├── chunk_store_test.go
│ ├── chunk_writer.go
│ └── config.go
├── cmd
│ ├── config.go
│ ├── flags
│ │ └── flags.go
│ └── main.go
├── config.go
├── limiter
│ ├── blob_rate_limiter.go
│ ├── blob_rate_limiter_test.go
│ ├── chunk_rate_limiter.go
│ ├── chunk_rate_limiter_test.go
│ ├── config.go
│ └── limiter_test.go
├── metadata_provider.go
├── metadata_provider_test.go
├── metrics
│ └── metrics.go
├── relay_test_utils.go
├── server.go
├── server_test.go
└── timeout_config.go
├── resources
└── srs
│ ├── README.md
│ ├── g1.point
│ ├── g2.point
│ ├── g2.trailing.point
│ └── srs-files-16777216.sha256
├── retriever
├── Makefile
├── cmd
│ ├── .keep
│ └── main.go
├── config.go
├── eth
│ ├── chain_client.go
│ └── chain_client_test.go
├── flags
│ └── flags.go
├── metrics.go
├── mock
│ └── chain_client.go
├── server.go
├── server_test.go
└── v2
│ ├── server.go
│ └── server_test.go
├── subgraphs
├── .gitignore
├── README.md
├── constants.ts
├── eigenda-batch-metadata
│ ├── abis
│ │ └── EigenDAServiceManager.json
│ ├── package.json
│ ├── schema.graphql
│ ├── src
│ │ └── edasm.ts
│ ├── templates
│ │ ├── networks.json
│ │ └── subgraph.yaml
│ ├── tests
│ │ ├── edasm-utils.ts
│ │ └── edasm.test.ts
│ └── yarn.lock
├── eigenda-operator-state
│ ├── VERSION
│ ├── abis
│ │ ├── BLSApkRegistry.json
│ │ ├── EjectionManager.json
│ │ └── RegistryCoordinator.json
│ ├── package.json
│ ├── schema.graphql
│ ├── src
│ │ ├── bls-apk-registry.ts
│ │ ├── ejection-manager.ts
│ │ ├── operator-creation.ts
│ │ ├── operator-registration-status.ts
│ │ ├── quorum-apk-updates.ts
│ │ └── registry-coordinator.ts
│ ├── templates
│ │ ├── networks.json
│ │ └── subgraph.yaml
│ ├── tests
│ │ ├── operator-state-utils.ts
│ │ ├── operator-state.test.ts
│ │ ├── quorum-apk-utils.ts
│ │ └── quorum-apk.test.ts
│ └── yarn.lock
├── package.json
├── tsconfig.json
└── yarn.lock
├── test.sh
├── test
├── integration_test.go
└── v2
│ ├── Makefile
│ ├── client
│ ├── test_client.go
│ ├── test_client_config.go
│ ├── test_client_metrics.go
│ ├── test_client_setup.go
│ └── util.go
│ ├── config
│ ├── environment
│ │ ├── preprod.json
│ │ └── testnet.json
│ └── load
│ │ ├── 100kb_s-1mb-3x.json
│ │ ├── 1mb_s-1mb-0x.json
│ │ └── 3mb_s-1mb-0x.json
│ ├── correctness
│ └── correctness_test.go
│ └── load
│ ├── load_generator.go
│ ├── load_generator_config.go
│ ├── load_generator_metrics.go
│ └── main
│ └── load_main.go
└── tools
├── calculator
└── calculator.html
├── ejections
├── Makefile
├── cmd
│ └── main.go
├── config.go
└── flags
│ └── flags.go
├── kzgpad
├── Makefile
└── main.go
├── quorumscan
├── Makefile
├── cmd
│ └── main.go
├── config.go
├── flags
│ └── flags.go
└── quorum.go
├── semverscan
├── Makefile
├── cmd
│ └── main.go
├── config.go
└── flags
│ └── flags.go
├── srs-utils
├── README.md
├── downloader
│ ├── downloader.go
│ ├── downloader_config.go
│ ├── flags.go
│ └── srs_hash_file.go
├── main.go
├── parser
│ ├── flags.go
│ ├── g1FileIO.go
│ ├── g2FileIO.go
│ ├── params.go
│ ├── parser.go
│ └── parser_test.go
├── resources
│ └── challenge_0085_with_4_g1_points
└── verifier
│ ├── flags.go
│ ├── gnarkParser.go
│ ├── verifier.go
│ └── verifier_test.go
└── traffic
├── Makefile
├── cmd
└── main.go
├── config.go
├── flags
└── flags.go
├── generator.go
└── generator_test.go
/.devcontainer/install.sh:
--------------------------------------------------------------------------------
1 | # Install foundry
2 | curl -L https://foundry.paradigm.xyz | bash
3 | ~/.foundry/bin/foundryup
4 |
5 | # Install go dependencies
6 | go install github.com/onsi/ginkgo/v2/ginkgo@v2.2.0
7 | go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
8 | go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
9 | go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
10 | # go install github.com/mikefarah/yq/v4@latest
11 |
12 | # yarn global add @graphprotocol/graph-cli@0.51.0
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | testdata
3 | data
4 | bin
5 | ./contracts/out
6 | ./contracts/cache
7 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto-generated files should not be rendered in diffs.
2 | docs/spec/src/protobufs/generated/*.md linguist-generated=true
3 | api/docs/*.html linguist-generated=true
4 | *.pb.go linguist-generated=true
5 | inabox/deploy/env_vars.go linguist-generated=true
6 | # contracts/bindings/*.go linguist-generated=true Enable once bindings are checked in CI
7 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # Clients
2 | # See https://github.com/orgs/Layr-Labs/teams/eigenda-intg
3 | /api/clients @Layr-Labs/eigenda-intg
4 |
5 | # Contracts
6 | /contracts @pakim249CAL
7 |
8 | # Security docs
9 | /docs/audits @anupsv
10 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/documentation.yml:
--------------------------------------------------------------------------------
1 | name: "📃 Documentation Request"
2 | description: Suggest improvements, additions, or revisions to EigenDA documentation
3 | title: "[Documentation]:
"
4 | labels: [docs, triage]
5 | body:
6 | - type: markdown
7 | attributes:
8 | value: |
9 | Thank you for helping us improve the EigenDA documentation!
10 | - type: textarea
11 | attributes:
12 | label: Documentation.
13 | description: Explain which part of the documents is lacking.
14 | placeholder: |
15 | Type here.
16 | validations:
17 | required: true
18 | - type: textarea
19 | attributes:
20 | label: Additional information.
21 | description: Tell us anything else you think we should know.
22 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/question.yml:
--------------------------------------------------------------------------------
1 | name: "🙋 Question"
2 | description: Ask a question or request support for using EigenDA
3 | title: "[Question]: "
4 | labels: [question, triage]
5 | body:
6 | - type: markdown
7 | attributes:
8 | value: |
9 | The GitHub issue tracker is not for questions.
10 | - If you have a question, please try asking it on
11 | - Our Docs:
12 | - type: textarea
13 | attributes:
14 | label: Question.
15 | description: Ask your question.
16 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ## Why are these changes needed?
2 |
3 |
4 |
5 | ## Checks
6 |
7 | - [ ] I've made sure the tests are passing. Note that there might be a few flaky tests, in that case, please comment that they are not relevant.
8 | - [ ] I've checked the new test coverage and the coverage percentage didn't drop.
9 | - Testing Strategy
10 | - [ ] Unit tests
11 | - [ ] Integration tests
12 | - [ ] This PR is not tested :(
13 |
--------------------------------------------------------------------------------
/.github/workflows/compile-protobufs.yaml:
--------------------------------------------------------------------------------
1 | name: compile-protobufs
2 | on:
3 | push:
4 | branches:
5 | - master
6 | pull_request:
7 | branches:
8 | - master
9 |
10 | jobs:
11 | golangci:
12 | name: Compile Protobufs
13 | runs-on: ubuntu-latest
14 | steps:
15 | - name: Checkout EigenDA
16 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #4.2.2
17 | - uses: bufbuild/buf-action@v1
18 | with:
19 | setup_only: true #only install buf -- needed by `make protoc` command
20 | - name: Recompile Protobufs
21 | run: |
22 | make clean
23 | make protoc
24 | - name: Verify No Git Changes
25 | run: ./api/builder/is-repo-clean.sh
26 |
--------------------------------------------------------------------------------
/.github/workflows/golangci-lint.yml:
--------------------------------------------------------------------------------
1 | name: lint
2 | on:
3 | push:
4 | branches:
5 | - master
6 | pull_request:
7 |
8 | env:
9 | MISE_VERSION: 2024.12.14
10 |
11 | jobs:
12 | golangci:
13 | name: Linter
14 | runs-on: ubuntu-latest
15 | steps:
16 | - name: Checkout EigenDA
17 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #4.2.2
18 |
19 | - uses: jdx/mise-action@v2
20 | with:
21 | version: ${{ env.MISE_VERSION }}
22 | experimental: true
23 | - run: go version
24 |
25 | - run: make lint
26 |
27 | - run: make fmt-check
28 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | inabox/testdata/*
2 | inabox/anvil.pid
3 |
4 | test/testdata/*
5 | inabox/resources/kzg/SRSTables/*
6 | encoding/kzgrs/prover/data/SRSTable/*
7 | resources/srs/SRSTables/*
8 |
9 | **/bin/*
10 | coverage.*
11 |
12 | contracts/broadcast
13 |
14 | lightnode/docker/build-info.txt
15 | lightnode/docker/args.sh
16 |
17 | .idea
18 | .env
19 | .vscode
20 | .claude
21 | .cursor
22 |
23 | icicle/*
24 |
25 | # OSX specific
26 | .DS_Store
27 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "contracts/lib/forge-std"]
2 | path = contracts/lib/forge-std
3 | url = https://github.com/foundry-rs/forge-std
4 | [submodule "contracts/lib/openzeppelin-contracts"]
5 | path = contracts/lib/openzeppelin-contracts
6 | url = https://github.com/OpenZeppelin/openzeppelin-contracts
7 | [submodule "contracts/lib/openzeppelin-contracts-upgradeable"]
8 | path = contracts/lib/openzeppelin-contracts-upgradeable
9 | url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
10 | [submodule "contracts/lib/eigenlayer-middleware"]
11 | path = contracts/lib/eigenlayer-middleware
12 | url = https://github.com/Layr-Labs/eigenlayer-middleware
13 | branch = m2-mainnet-fixes
14 |
--------------------------------------------------------------------------------
/.golangci.yml:
--------------------------------------------------------------------------------
1 | version: "2"
2 |
3 | run:
4 | # CI was timing out with the default timeout of 1m.
5 | timeout: 5m
6 |
7 | # But right now revive raises 50+ issues, whereas golint didn't have any.
8 | # despite revive being recommended as a replacement for golint.
9 | # TODO: should we turn on revive and fix the issues?
10 | # linters:
11 | # enable:
12 | # - revive # drop-in replacement for golint
13 |
--------------------------------------------------------------------------------
/GitVersion.yml:
--------------------------------------------------------------------------------
1 | increment: None
2 | branches:
3 | main:
4 | mode: ContinuousDelivery
5 | tag: pre
6 | increment: Patch
7 | prevent-increment-of-merged-branch-version: true
8 | track-merge-target: false
9 | regex: ^master$|^main$
10 | source-branches: []
11 | tracks-release-branches: true
12 | is-release-branch: false
13 | is-mainline: true
14 | pre-release-weight: 55000
15 | release:
16 | mode: ContinuousDelivery
17 | tag: rc
18 | increment: None
19 | prevent-increment-of-merged-branch-version: true
20 | track-merge-target: false
21 | regex: ^tags/v\d+\.\d+\.\d+(-[a-z]+\.\d+)?|^releases?[/-]
22 | source-branches: []
23 | tracks-release-branches: false
24 | is-release-branch: true
25 | is-mainline: false
26 | pre-release-weight: 30000
27 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Version Information
4 |
5 | Please see [Releases](https://github.com/Layr-Labs/eigenda/releases) and we recommend using the [most recently released version](https://github.com/Layr-Labs/eigenda/releases/latest).
6 |
7 | ## Audit reports
8 |
9 | Audit reports are published in the `docs` folder: https://github.com/Layr-Labs/eigenda/master/docs/audits
10 |
11 | | Date | Report Link |
12 | | ------- | ----------- |
13 | | 202404 | [pdf](https://github.com/Layr-Labs/eigenda/blob/security-doc/docs/audits/Sigma_Prime_EigenDA_Offchain_Security_Assessment_Report.pdf) |
14 |
15 | ## Reporting a Vulnerability
16 |
17 | **Please do not file a public ticket** mentioning the vulnerability.
18 |
19 | Please report security vulnerabilities to security@eigenlabs.org with the all the relavent details included in the email.
20 |
21 |
--------------------------------------------------------------------------------
/api/Makefile:
--------------------------------------------------------------------------------
1 | # Buf commands to lint/format proto files
2 | # All of these commands are run by the github action in `.github/workflows/buf-proto.yaml`
3 | proto-lint:
4 | buf lint
5 |
6 | proto-format:
7 | buf format -w
8 |
9 | # Builds the protobuf files inside a docker container.
10 | protoc: clean proto-format
11 | ./builder/protoc-docker.sh
12 |
13 | # Builds the protobuf files locally (i.e. without docker).
14 | protoc-local: clean
15 | ./builder/protoc.sh
16 |
17 | clean:
18 | ./builder/clean.sh
--------------------------------------------------------------------------------
/api/builder/README.md:
--------------------------------------------------------------------------------
1 | This directory contains scripts for building a docker image capable of compiling the EigenDA protobufs. I found
2 | it difficult to control the exact build version of the protobufs, since the version depends on whatever is installed
3 | locally when they are built. This is an attempt to standardize the protobuf build process.
4 |
5 | # Usage
6 |
7 | To build the docker image, run the following command:
8 |
9 | ```bash
10 | ./api/builder/build-docker.sh
11 | ```
12 |
13 | Once the docker image is built, you can build the protobufs via the following command:
14 |
15 | ```bash
16 | ./api/builder/protoc-docker.sh
17 | ```
18 |
19 | # Caveats
20 |
21 | I've tested this on my m3 macbook. It's possible that the docker image may have trouble on other architectures.
22 | Please report any issues you encounter with this build process to the EigenDA team. The goal is to be arcihtecturally
23 | agnostic, but that isn't a priority in the very short term.
24 |
--------------------------------------------------------------------------------
/api/builder/build-docker.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # The location where this script can be found.
4 | SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
5 |
6 | ARCH=$(uname -m)
7 | if [ "${ARCH}" == "arm64" ]; then
8 | PROTOC_URL='https://github.com/protocolbuffers/protobuf/releases/download/v23.4/protoc-23.4-linux-aarch_64.zip'
9 | elif [ "${ARCH}" == "x86_64" ]; then
10 | PROTOC_URL='https://github.com/protocolbuffers/protobuf/releases/download/v23.4/protoc-23.4-linux-x86_64.zip'
11 | else
12 | echo "Unsupported architecture: ${ARCH}"
13 | exit 1
14 | fi
15 |
16 | # Add the --no-cache flag to force a rebuild.
17 | # Add the --progress=plain flag to show verbose output during the build.
18 |
19 | docker build \
20 | -f "${SCRIPT_DIR}/Dockerfile" \
21 | --tag pbuf-compiler:latest \
22 | --build-arg PROTOC_URL="${PROTOC_URL}" \
23 | --build-arg UID=$(id -u) \
24 | .
25 |
26 | if [ $? -ne 0 ]; then
27 | exit 1
28 | fi
--------------------------------------------------------------------------------
/api/builder/clean.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # This script finds and deletes all compiled protobufs.
4 |
5 | # The location where this script can be found.
6 | SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
7 |
8 | API_DIR="${SCRIPT_DIR}/.."
9 | GRPC_DIR="${API_DIR}/grpc"
10 |
11 | if [ -d "${GRPC_DIR}" ]; then
12 | # Delete all compiled protobufs
13 | find "${GRPC_DIR}" -name '*.pb.go' -type f | xargs rm -rf
14 | # Delete all empty directories
15 | find "${GRPC_DIR}" -type d -empty -delete
16 | fi
17 |
18 | DISPERSER_DIR="$SCRIPT_DIR/../../disperser"
19 | DISPERSER_GRPC_DIR="$DISPERSER_DIR/api/grpc"
20 | if [ -d "${DISPERSER_GRPC_DIR}" ]; then
21 | # Delete all compiled protobufs
22 | find "${DISPERSER_GRPC_DIR}" -name '*.pb.go' -type f | xargs rm -rf
23 | # Delete all empty directories
24 | find "${DISPERSER_GRPC_DIR}" -type d -empty -delete
25 | fi
--------------------------------------------------------------------------------
/api/builder/debug-docker.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # This is a handy little script for debugging the pbuf-compiler container. Attaches a bash shell to the container.
4 |
5 | # The location where this script can be found.
6 | SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
7 | ROOT="${SCRIPT_DIR}/../.."
8 |
9 | docker container run \
10 | --rm \
11 | --mount "type=bind,source=${ROOT},target=/home/user/eigenda" \
12 | -it \
13 | pbuf-compiler bash
14 |
15 |
--------------------------------------------------------------------------------
/api/builder/is-repo-clean.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # This script exits with error code 0 if the git repository is clean, and error code 1 if it is not.
4 | # This is utilized by the github workflow that checks to see if the repo is clean after recompiling
5 | # protobufs.
6 |
7 | if output=$(git status --porcelain) && [ -z "$output" ]; then
8 | echo "Repository is clean."
9 | exit 0
10 | else
11 | echo "Repository is dirty:"
12 | git status
13 | git diff
14 | exit 1
15 | fi
--------------------------------------------------------------------------------
/api/builder/protoc-docker.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # This script builds the eigenDA protobufs. It does this by running protoc.sh inside of the pbuf-compiler container.
4 |
5 | # The location where this script can be found.
6 | SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
7 | ROOT="${SCRIPT_DIR}/../.."
8 |
9 | if [ -z "$(docker images -q pbuf-compiler:latest 2> /dev/null)" ]; then
10 | echo "Docker image pbuf-compiler:latest does not exist. Building it now..."
11 | "${SCRIPT_DIR}"/build-docker.sh
12 | fi
13 |
14 | if [ $? -ne 0 ]; then
15 | exit 1
16 | fi
17 |
18 | docker container run \
19 | --rm \
20 | --mount "type=bind,source=${ROOT},target=/home/user/eigenda" \
21 | pbuf-compiler bash -c "source ~/.bashrc && eigenda/api/builder/protoc.sh"
22 |
23 | if [ $? -ne 0 ]; then
24 | exit 1
25 | fi
--------------------------------------------------------------------------------
/api/builder/protoc.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -o errexit -o nounset -o pipefail
3 |
4 | # This script builds the eigenDA protobufs.
5 |
6 | # The location where this script can be found.
7 | SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
8 |
9 | # Build protobufs in the api/proto directory.
10 |
11 | API_DIR="${SCRIPT_DIR}/.."
12 | PROTO_DIR="${API_DIR}/proto"
13 | GRPC_DIR="${API_DIR}/grpc"
14 | mkdir -p "${GRPC_DIR}"
15 |
16 | if [ $? -ne 0 ]; then
17 | exit 1
18 | fi
19 |
20 | PROTO_FILES=($(find "${PROTO_DIR}" -name '*.proto'))
21 |
22 | protoc -I "${PROTO_DIR}" \
23 | --go_out="${GRPC_DIR}" \
24 | --go_opt=paths=source_relative \
25 | --go-grpc_out="${GRPC_DIR}" \
26 | --go-grpc_opt=paths=source_relative \
27 | ${PROTO_FILES[@]}
28 |
29 | if [ $? -ne 0 ]; then
30 | exit 1
31 | fi
32 |
--------------------------------------------------------------------------------
/api/builder/rm-docker.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # This script fully deletes the pbuf-compiler docker image and all cached steps.
4 |
5 | # Cleans the docker image and all cached steps.
6 | docker image rm pbuf-compiler 2> /dev/null || true
7 | docker builder prune -f
--------------------------------------------------------------------------------
/api/clients/codecs/no_ifft_codec.go:
--------------------------------------------------------------------------------
1 | package codecs
2 |
3 | type NoIFFTCodec struct {
4 | writeCodec BlobCodec
5 | }
6 |
7 | var _ BlobCodec = NoIFFTCodec{}
8 |
9 | func NewNoIFFTCodec(writeCodec BlobCodec) NoIFFTCodec {
10 | return NoIFFTCodec{
11 | writeCodec: writeCodec,
12 | }
13 | }
14 |
15 | func (v NoIFFTCodec) EncodeBlob(data []byte) ([]byte, error) {
16 | return v.writeCodec.EncodeBlob(data)
17 | }
18 |
19 | func (v NoIFFTCodec) DecodeBlob(data []byte) ([]byte, error) {
20 | return GenericDecodeBlob(data)
21 | }
22 |
--------------------------------------------------------------------------------
/api/clients/codecs/polynomial_form.go:
--------------------------------------------------------------------------------
1 | package codecs
2 |
3 | // PolynomialForm is an enum that describes the different ways a polynomial may be represented.
4 | type PolynomialForm uint
5 |
6 | const (
7 | // PolynomialFormEval is short for polynomial "evaluation form".
8 | // The field elements represent the evaluation of the polynomial at roots of unity.
9 | PolynomialFormEval PolynomialForm = iota
10 | // PolynomialFormCoeff is short for polynomial "coefficient form".
11 | // The field elements represent the coefficients of the polynomial.
12 | PolynomialFormCoeff
13 | )
14 |
--------------------------------------------------------------------------------
/api/clients/mock/disperser_server.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | disperser_rpc "github.com/Layr-Labs/eigenda/api/grpc/disperser"
7 | )
8 |
9 | // Currently only implements the RetrieveBlob RPC
10 | type DisperserServer struct {
11 | disperser_rpc.UnimplementedDisperserServer
12 | }
13 |
14 | // RetrieveBlob returns a ~5MiB(+header_size) blob. It is used to test that the client correctly sets the max message size,
15 | // to be able to support large blobs (default grpc max message size is 4MiB).
16 | func (m *DisperserServer) RetrieveBlob(ctx context.Context, req *disperser_rpc.RetrieveBlobRequest) (*disperser_rpc.RetrieveBlobReply, error) {
17 | // Create a blob larger than default max size (4MiB)
18 | largeBlob := make([]byte, 5*1024*1024) // 5MiB
19 | for i := range largeBlob {
20 | largeBlob[i] = byte(i % 256)
21 | }
22 |
23 | return &disperser_rpc.RetrieveBlobReply{
24 | Data: largeBlob,
25 | }, nil
26 | }
27 |
--------------------------------------------------------------------------------
/api/clients/mock/static_request_signer.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 | "crypto/ecdsa"
6 |
7 | "github.com/Layr-Labs/eigenda/api/clients/v2"
8 | "github.com/Layr-Labs/eigenda/api/grpc/validator"
9 | "github.com/Layr-Labs/eigenda/node/auth"
10 | )
11 |
12 | var _ clients.DispersalRequestSigner = &staticRequestSigner{}
13 |
14 | // StaticRequestSigner is a DispersalRequestSigner that signs requests with a static key (i.e. it doesn't use AWS KMS).
15 | // Useful for testing.
16 | type staticRequestSigner struct {
17 | key *ecdsa.PrivateKey
18 | }
19 |
20 | func NewStaticRequestSigner(key *ecdsa.PrivateKey) clients.DispersalRequestSigner {
21 | return &staticRequestSigner{
22 | key: key,
23 | }
24 | }
25 |
26 | func (s *staticRequestSigner) SignStoreChunksRequest(
27 | ctx context.Context,
28 | request *validator.StoreChunksRequest) ([]byte, error) {
29 |
30 | return auth.SignStoreChunksRequest(s.key, request)
31 | }
32 |
--------------------------------------------------------------------------------
/api/clients/v2/README.md:
--------------------------------------------------------------------------------
1 | # Core Clients
2 |
3 | 
4 |
5 | TODO(litt3): Expand this README
--------------------------------------------------------------------------------
/api/clients/v2/cert_verifier_address_provider.go:
--------------------------------------------------------------------------------
1 | package clients
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/ethereum/go-ethereum/common"
7 | )
8 |
9 | // CertVerifierAddressProvider defines an object which can translate block number to cert verifier address
10 | //
11 | // This provider uses reference block number as a key, since updates to a cert verifier address in a running system are
12 | // coordinated by defining the reference block number at which a new cert verifier address takes effect. Specifically,
13 | // a blob shall be verified by the latest defined cert verifier contract with a reference block number key that doesn't
14 | // exceed the reference block number of the blob's batch.
15 | type CertVerifierAddressProvider interface {
16 | // GetCertVerifierAddress returns the EigenDACertVerifierAddress that is active at the input reference block number
17 | GetCertVerifierAddress(ctx context.Context, referenceBlockNumber uint64) (common.Address, error)
18 | }
19 |
--------------------------------------------------------------------------------
/api/clients/v2/examples/utils.go:
--------------------------------------------------------------------------------
1 | package examples
2 |
3 | import (
4 | "crypto/rand"
5 |
6 | "github.com/Layr-Labs/eigenda/api/clients/v2/coretypes"
7 | )
8 |
9 | // createRandomPayload creates a payload with random data of the specified size in bytes
10 | func createRandomPayload(byteCount int) (*coretypes.Payload, error) {
11 | payloadBytes := make([]byte, byteCount)
12 | _, err := rand.Read(payloadBytes)
13 | if err != nil {
14 | return nil, err
15 | }
16 | return coretypes.NewPayload(payloadBytes), nil
17 | }
18 |
--------------------------------------------------------------------------------
/api/clients/v2/mock/node_client.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/Layr-Labs/eigenda/api/clients/v2"
7 | "github.com/Layr-Labs/eigenda/core"
8 | corev2 "github.com/Layr-Labs/eigenda/core/v2"
9 | "github.com/stretchr/testify/mock"
10 | )
11 |
12 | type MockNodeClient struct {
13 | mock.Mock
14 | }
15 |
16 | var _ clients.NodeClient = (*MockNodeClient)(nil)
17 |
18 | func NewNodeClient() *MockNodeClient {
19 | return &MockNodeClient{}
20 | }
21 |
22 | func (c *MockNodeClient) StoreChunks(ctx context.Context, batch *corev2.Batch) (*core.Signature, error) {
23 | args := c.Called()
24 | var signature *core.Signature
25 | if args.Get(0) != nil {
26 | signature = (args.Get(0)).(*core.Signature)
27 | }
28 | return signature, args.Error(1)
29 | }
30 |
31 | func (c *MockNodeClient) Close() error {
32 | args := c.Called()
33 | return args.Error(0)
34 | }
35 |
--------------------------------------------------------------------------------
/api/clients/v2/payload_retriever.go:
--------------------------------------------------------------------------------
1 | package clients
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/Layr-Labs/eigenda/api/clients/v2/coretypes"
7 | )
8 |
9 | // PayloadRetriever represents something that knows how to retrieve a payload from some backend using a verification.EigenDACert
10 | //
11 | // This interface may be implemented to provide alternate retrieval methods, for example payload retrieval from an S3
12 | // bucket instead of from EigenDA relays or nodes.
13 | type PayloadRetriever interface {
14 | // GetPayload retrieves a payload from some backend, using the provided certificate
15 | GetPayload(ctx context.Context, eigenDACert coretypes.RetrievableEigenDACert) (*coretypes.Payload, error)
16 | }
17 |
--------------------------------------------------------------------------------
/api/clients/v2/utils.go:
--------------------------------------------------------------------------------
1 | package clients
2 |
3 | import (
4 | "crypto/tls"
5 |
6 | "google.golang.org/grpc"
7 | "google.golang.org/grpc/credentials"
8 | "google.golang.org/grpc/credentials/insecure"
9 | )
10 |
11 | // GetGrpcDialOptions builds the gRPC dial options based on the useSecureGrpcFlag and maxMessageSize.
12 | func GetGrpcDialOptions(useSecureGrpcFlag bool, maxMessageSize uint) []grpc.DialOption {
13 | options := []grpc.DialOption{}
14 | if useSecureGrpcFlag {
15 | options = append(options, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
16 | } else {
17 | options = append(options, grpc.WithTransportCredentials(insecure.NewCredentials()))
18 | }
19 |
20 | options = append(options, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(int(maxMessageSize))))
21 |
22 | return options
23 | }
24 |
--------------------------------------------------------------------------------
/api/constants.go:
--------------------------------------------------------------------------------
1 | package api
2 |
3 | // EigenLabsDisperserID is the ID of the disperser that is managed by Eigen Labs.
4 | const EigenLabsDisperserID = uint32(0)
5 |
--------------------------------------------------------------------------------
/api/hashing/payment_state_hashing.go:
--------------------------------------------------------------------------------
1 | package hashing
2 |
3 | import (
4 | "fmt"
5 | "github.com/ethereum/go-ethereum/common"
6 | "golang.org/x/crypto/sha3"
7 | )
8 |
9 | // HashGetPaymentStateRequest hashes the given GetPaymentStateRequest from accountId and timestamp
10 | func HashGetPaymentStateRequest(accountId common.Address, timestamp uint64) ([]byte, error) {
11 | hasher := sha3.NewLegacyKeccak256()
12 |
13 | // Hash the accountId
14 | err := hashByteArray(hasher, accountId.Bytes())
15 | if err != nil {
16 | return nil, fmt.Errorf("failed to hash account id: %w", err)
17 | }
18 |
19 | // Hash the timestamp
20 | hashUint64(hasher, timestamp)
21 |
22 | return hasher.Sum(nil), nil
23 | }
24 |
--------------------------------------------------------------------------------
/common/abi.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import (
4 | _ "embed"
5 |
6 | "github.com/ethereum/go-ethereum/crypto"
7 | )
8 |
9 | //go:embed abis/EigenDAServiceManager.json
10 | var ServiceManagerAbi []byte
11 |
12 | var BatchConfirmedEventSigHash = crypto.Keccak256Hash([]byte("BatchConfirmed(bytes32,uint32)"))
13 |
--------------------------------------------------------------------------------
/common/healthcheck/server.go:
--------------------------------------------------------------------------------
1 | package healthcheck
2 |
3 | import (
4 | "google.golang.org/grpc"
5 | "google.golang.org/grpc/health"
6 | "google.golang.org/grpc/health/grpc_health_v1"
7 | )
8 |
9 | // RegisterHealthServer registers the default gRPC health check server implementation
10 | // with the given gRPC server.
11 | func RegisterHealthServer(name string, server *grpc.Server) {
12 | healthServer := health.NewServer()
13 | healthServer.SetServingStatus(name, grpc_health_v1.HealthCheckResponse_SERVING)
14 | grpc_health_v1.RegisterHealthServer(server, healthServer)
15 | }
16 |
--------------------------------------------------------------------------------
/common/kvstore/tablestore/key_test.go:
--------------------------------------------------------------------------------
1 | package tablestore
2 |
3 | import (
4 | "testing"
5 |
6 | tu "github.com/Layr-Labs/eigenda/common/testutils"
7 | "github.com/stretchr/testify/assert"
8 | )
9 |
10 | func TestGetName(t *testing.T) {
11 | tu.InitializeRandom()
12 |
13 | tableName := tu.RandomString(10)
14 |
15 | kb := newKeyBuilder(tableName, 0)
16 | assert.Equal(t, tableName, kb.TableName())
17 | }
18 |
19 | func TestBytesRoundTrip(t *testing.T) {
20 | tu.InitializeRandom()
21 |
22 | tableName := tu.RandomString(10)
23 | b := tu.RandomBytes(10)
24 |
25 | kb := newKeyBuilder(tableName, 0)
26 | k := kb.Key(b)
27 | assert.Equal(t, b, k.Bytes())
28 | }
29 |
--------------------------------------------------------------------------------
/common/kvstore/tablestore/util.go:
--------------------------------------------------------------------------------
1 | package tablestore
2 |
3 | import (
4 | "encoding/binary"
5 | "time"
6 | )
7 |
8 | // prependTimestamp prepends the given timestamp to the given base byte slice. The timestamp is
9 | // stored as an 8-byte big-endian integer.
10 | func prependTimestamp(
11 | timestamp time.Time,
12 | baseValue []byte) []byte {
13 |
14 | result := make([]byte, len(baseValue)+8)
15 | unixNano := timestamp.UnixNano()
16 | binary.BigEndian.PutUint64(result, uint64(unixNano))
17 |
18 | copy(result[8:], baseValue)
19 |
20 | return result
21 | }
22 |
23 | // parsePrependedTimestamp extracts the timestamp and base key from the given byte slice. This method
24 | // is the inverse of prependTimestamp.
25 | func parsePrependedTimestamp(data []byte) (timestamp time.Time, baseValue []byte) {
26 | expiryUnixNano := int64(binary.BigEndian.Uint64(data))
27 | timestamp = time.Unix(0, expiryUnixNano)
28 | baseValue = data[8:]
29 | return timestamp, baseValue
30 | }
31 |
--------------------------------------------------------------------------------
/common/memory/Dockerfile.memtest:
--------------------------------------------------------------------------------
1 | FROM golang:1.21-alpine
2 |
3 | WORKDIR /app
4 |
5 | # Copy go.mod, go.sum and relevant files
6 | COPY go.mod go.sum ./
7 | RUN go mod download
8 |
9 | # Copy common package and its dependencies
10 | COPY common/ ./common/
11 |
12 | # Run the memory test
13 | CMD ["go", "test", "-v", "./common/memory", "-run", "TestGetMaximumAvailableMemory"]
--------------------------------------------------------------------------------
/common/memory/memory_test.go:
--------------------------------------------------------------------------------
1 | package memory
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 |
7 | "github.com/docker/go-units"
8 | "github.com/stretchr/testify/require"
9 | )
10 |
11 | func TestGetMaximumAvailableMemory(t *testing.T) {
12 | memory, err := GetMaximumAvailableMemory()
13 | require.NoError(t, err)
14 |
15 | // Since the outcome of this test depends on the environment, we can only check if the value is greater than 0.
16 | // This test is mostly intended designed for manual verification, although it does at least verify that the
17 | // function does not return an error.
18 | fmt.Printf("Maximum available memory: %dGB\n", memory/units.GiB)
19 | require.Greater(t, memory, uint64(0), "Memory should be greater than 0")
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/common/memory/run_memory_test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Set the memory limit (2GB by default, but can be overridden)
4 | MEMORY_LIMIT=${1:-2g}
5 |
6 | # Directory containing the Dockerfile and where the command should be executed
7 | cd "$(dirname "$0")/../.."
8 |
9 | # Build the Docker image
10 | echo "Building Docker image..."
11 | docker build -t eigenda-memory-test -f common/memory/Dockerfile.memtest .
12 |
13 | # Run the container with the specified memory limit
14 | echo "Running test with ${MEMORY_LIMIT} memory limit..."
15 | docker run --rm -m "${MEMORY_LIMIT}" eigenda-memory-test
16 |
17 | echo "Test completed."
--------------------------------------------------------------------------------
/common/mock/ratelimiter.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/Layr-Labs/eigenda/common"
7 | )
8 |
9 | type NoopRatelimiter struct {
10 | }
11 |
12 | var _ common.RateLimiter = &NoopRatelimiter{}
13 |
14 | func (r *NoopRatelimiter) AllowRequest(ctx context.Context, params []common.RequestParams) (bool, *common.RequestParams, error) {
15 | return true, nil, nil
16 | }
17 |
--------------------------------------------------------------------------------
/common/param_store.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import "context"
4 |
5 | // KVStore is a simple key value store interface.
6 | type KVStore[T any] interface {
7 | // GetItem returns the value associated with a given key.
8 | GetItem(ctx context.Context, key string) (*T, error)
9 | // UpdateItem updates the value for the given key.
10 | UpdateItem(ctx context.Context, key string, value *T) error
11 | }
12 |
--------------------------------------------------------------------------------
/common/pprof/server.go:
--------------------------------------------------------------------------------
1 | package pprof
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 |
7 | _ "net/http/pprof"
8 |
9 | "github.com/Layr-Labs/eigensdk-go/logging"
10 | )
11 |
12 | type PprofProfiler struct {
13 | logger logging.Logger
14 | httpPort string
15 | }
16 |
17 | func NewPprofProfiler(httpPort string, logger logging.Logger) *PprofProfiler {
18 | return &PprofProfiler{
19 | logger: logger.With("component", "PprofProfiler"),
20 | httpPort: httpPort,
21 | }
22 | }
23 |
24 | // Start the pprof server
25 | func (p *PprofProfiler) Start() {
26 | pprofAddr := fmt.Sprintf("%s:%s", "0.0.0.0", p.httpPort)
27 |
28 | if err := http.ListenAndServe(pprofAddr, nil); err != nil {
29 | p.logger.Error("pprof server failed", "error", err, "pprofAddr", pprofAddr)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/common/pubip/mock_provider.go:
--------------------------------------------------------------------------------
1 | package pubip
2 |
3 | import "context"
4 |
5 | var _ Provider = (*mockProvider)(nil)
6 |
7 | // mockProvider is a mock implementation of the Provider interface.
8 | type mockProvider struct {
9 | }
10 |
11 | func (m mockProvider) Name() string {
12 | return "mockip"
13 | }
14 |
15 | func (m mockProvider) PublicIPAddress(ctx context.Context) (string, error) {
16 | return "localhost", nil
17 | }
18 |
--------------------------------------------------------------------------------
/common/read_only_map.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import (
4 | "maps"
5 | )
6 |
7 | type ReadOnlyMap[K comparable, V comparable] struct {
8 | data map[K]V
9 | }
10 |
11 | func NewReadOnlyMap[K comparable, V comparable](data map[K]V) *ReadOnlyMap[K, V] {
12 | return &ReadOnlyMap[K, V]{data: data}
13 | }
14 |
15 | func (m *ReadOnlyMap[K, V]) Get(key K) (V, bool) {
16 | value, ok := m.data[key]
17 | return value, ok
18 | }
19 |
20 | func (m *ReadOnlyMap[K, V]) Keys() []K {
21 | keys := make([]K, 0, len(m.data))
22 | for key := range m.data {
23 | keys = append(keys, key)
24 | }
25 | return keys
26 | }
27 |
28 | func (m *ReadOnlyMap[K, V]) Len() int {
29 | return len(m.data)
30 | }
31 |
32 | func (m *ReadOnlyMap[K, V]) Equal(data map[K]V) bool {
33 | return maps.Equal(m.data, data)
34 | }
35 |
--------------------------------------------------------------------------------
/common/read_only_map_test.go:
--------------------------------------------------------------------------------
1 | package common_test
2 |
3 | import (
4 | "testing"
5 |
6 | "github.com/Layr-Labs/eigenda/common"
7 | "github.com/stretchr/testify/require"
8 | )
9 |
10 | func TestReadOnlyMap(t *testing.T) {
11 | data := map[uint8]string{
12 | 1: "one",
13 | 2: "two",
14 | 3: "three",
15 | }
16 | m := common.NewReadOnlyMap(data)
17 | res, ok := m.Get(1)
18 | require.True(t, ok)
19 | require.Equal(t, "one", res)
20 | res, ok = m.Get(2)
21 | require.True(t, ok)
22 | require.Equal(t, "two", res)
23 | res, ok = m.Get(3)
24 | require.True(t, ok)
25 | require.Equal(t, "three", res)
26 | res, ok = m.Get(4)
27 | require.False(t, ok)
28 | require.Equal(t, "", res)
29 | require.Equal(t, 3, m.Len())
30 | require.ElementsMatch(t, []uint8{1, 2, 3}, m.Keys())
31 | }
32 |
--------------------------------------------------------------------------------
/common/replay/no_op_replay_gaurdian.go:
--------------------------------------------------------------------------------
1 | package replay
2 |
3 | import (
4 | "time"
5 | )
6 |
7 | var _ ReplayGuardian = &noOpReplayGuardian{}
8 |
9 | // noOpReplayGuardian is a ReplayGuardian that does nothing, always accepting requests without actually verifying them.
10 | // Useful for unit tests where that want to be able to send duplicate requests without mocking the clock.
11 | type noOpReplayGuardian struct{}
12 |
13 | // NewNoOpReplayGuardian creates a new ReplayGuardian that does nothing, always accepting requests without actually
14 | // verifying them. Useful for unit tests where that want to be able to send duplicate requests without mocking the
15 | // clock.
16 | func NewNoOpReplayGuardian() ReplayGuardian {
17 | return &noOpReplayGuardian{}
18 | }
19 |
20 | func (n *noOpReplayGuardian) VerifyRequest(requestHash []byte, requestTimestamp time.Time) error {
21 | return nil
22 | }
23 |
--------------------------------------------------------------------------------
/common/replay/replay_gaurdian.go:
--------------------------------------------------------------------------------
1 | package replay
2 |
3 | import "time"
4 |
5 | // ReplayGuardian ensures that the same request is not processed more than once. It can be used to do things such
6 | // as protecting against replay attacks or accidental duplicate requests.
7 | type ReplayGuardian interface {
8 |
9 | // VerifyRequest verifies that a request with the given hash and timestamp is not a replay
10 | // of a previous request. If it cannot be determined if a request is a replay or not,
11 | // then the request is rejected. Only if it can be guaranteed that the request is not a replay
12 | // will this method return nil.
13 | VerifyRequest(
14 | requestHash []byte,
15 | requestTimestamp time.Time) error
16 | }
17 |
--------------------------------------------------------------------------------
/common/rpc_ethclient.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/ethereum/go-ethereum/rpc"
7 | )
8 |
9 | type RPCEthClient interface {
10 | BatchCall(b []rpc.BatchElem) error
11 | BatchCallContext(ctx context.Context, b []rpc.BatchElem) error
12 | Call(result interface{}, method string, args ...interface{}) error
13 | CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error
14 | }
15 |
--------------------------------------------------------------------------------
/common/store/local_store.go:
--------------------------------------------------------------------------------
1 | package store
2 |
3 | import (
4 | "context"
5 | "errors"
6 |
7 | "github.com/Layr-Labs/eigenda/common"
8 | lru "github.com/hashicorp/golang-lru/v2"
9 | )
10 |
11 | type localParamStore[T any] struct {
12 | cache *lru.Cache[string, T]
13 | }
14 |
15 | func NewLocalParamStore[T any](size int) (common.KVStore[T], error) {
16 | cache, err := lru.New[string, T](size)
17 | if err != nil {
18 | return nil, err
19 | }
20 |
21 | return &localParamStore[T]{
22 | cache: cache,
23 | }, nil
24 | }
25 |
26 | func (s *localParamStore[T]) GetItem(ctx context.Context, key string) (*T, error) {
27 |
28 | obj, ok := s.cache.Get(key)
29 | if !ok {
30 | return nil, errors.New("error retrieving key")
31 | }
32 |
33 | return &obj, nil
34 |
35 | }
36 |
37 | func (s *localParamStore[T]) UpdateItem(ctx context.Context, key string, params *T) error {
38 |
39 | s.cache.Add(key, *params)
40 |
41 | return nil
42 | }
43 |
--------------------------------------------------------------------------------
/common/testutils/test_utils_test.go:
--------------------------------------------------------------------------------
1 | package testutils
2 |
3 | import (
4 | "github.com/stretchr/testify/assert"
5 | "golang.org/x/exp/rand"
6 | "testing"
7 | )
8 |
9 | func TestRandomSetup(t *testing.T) {
10 | InitializeRandom()
11 | x := rand.Int()
12 |
13 | InitializeRandom()
14 | y := rand.Int()
15 |
16 | assert.NotEqual(t, x, y)
17 |
18 | seed := uint64(rand.Int())
19 | InitializeRandom(seed)
20 | a := rand.Int()
21 |
22 | InitializeRandom(seed)
23 | b := rand.Int()
24 |
25 | assert.Equal(t, a, b)
26 | }
27 |
--------------------------------------------------------------------------------
/common/workerpool.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import "context"
4 |
5 | // WorkerPool is an interface for a worker pool taken from "github.com/gammazero/workerpool"
6 | type WorkerPool interface {
7 | Size() int
8 | Stop()
9 | StopWait()
10 | Stopped() bool
11 | Submit(task func())
12 | SubmitWait(task func())
13 | WaitingQueueSize() int
14 | Pause(ctx context.Context)
15 | }
16 |
--------------------------------------------------------------------------------
/contracts/.dockerignore:
--------------------------------------------------------------------------------
1 | cache/
2 | out/
3 | broadcast/
4 | bindings/
--------------------------------------------------------------------------------
/contracts/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiler files
2 | cache/
3 | out/
4 |
5 | # Ignores development broadcast logs
6 | !/broadcast
7 | /broadcast/*/31337/
8 | /broadcast/*/40525/
9 | /broadcast/**/dry-run/
10 |
11 | # Docs
12 | docs/
13 |
14 | # Dotenv file
15 | .env
16 |
17 | data/
18 |
19 | script/output/*
20 | script/input/eigenda_deploy_config.json
21 |
22 | # yarn dependencies
23 | yarn.lock
24 | node_modules
25 |
26 | # release dependencies
27 | artifacts/
--------------------------------------------------------------------------------
/contracts/Dockerfile:
--------------------------------------------------------------------------------
1 | # Use the latest foundry image
2 | FROM --platform=linux/amd64 ghcr.io/foundry-rs/foundry:latest
3 |
4 | # Copy our source code into the container
5 | WORKDIR /app
6 |
7 | # Build and test the source code
8 | COPY . .
9 | RUN forge build
10 | RUN forge test
11 |
12 | # Set the entrypoint to the forge command
13 | ENTRYPOINT ["/bin/sh", "-c"]
--------------------------------------------------------------------------------
/contracts/Makefile:
--------------------------------------------------------------------------------
1 | deps:
2 | yarn
3 |
4 | compile: deps
5 | # compile.sh compiles the contracts and creates go bindings
6 | ./compile.sh
7 |
8 | fmt:
9 | forge fmt
10 |
11 | fmt-check:
12 | forge fmt --check
--------------------------------------------------------------------------------
/contracts/foundry.toml:
--------------------------------------------------------------------------------
1 | [profile.default]
2 | src = 'src'
3 | out = 'out'
4 | libs = ['lib']
5 | fs_permissions = [{ access = "read-write", path = "./" }]
6 |
7 | # We force all warnings to be fixed
8 | deny_warnings = true
9 | # We error warnings from libraries. This should be fixed upstream but I'm lazy.
10 | # See https://github.com/ethereum/solidity/issues/2675 for an interesting discussion.
11 | ignored_warnings_from = [
12 | "lib/eigenlayer-middleware/src/RegistryCoordinator.sol",
13 | ]
14 |
15 | gas_reports = ["*"]
16 |
17 | # Enables or disables the optimizer
18 | optimizer = true
19 | # The number of optimizer runs
20 | optimizer_runs = 200
21 | # Whether or not to use the Yul intermediate representation compilation pipeline
22 | via_ir = false
23 | # Override the Solidity version (this overrides `auto_detect_solc`)
24 | solc_version = '0.8.12'
25 |
--------------------------------------------------------------------------------
/contracts/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@eigenda/contracts",
3 | "version": "0.1.0",
4 | "description": "EigenDA core contracts",
5 | "main": "index.js",
6 | "directories": {
7 | "lib": "lib",
8 | "test": "test",
9 | "src": "src"
10 | },
11 | "files": [
12 | "out/",
13 | "src/",
14 | "lib/"
15 | ],
16 | "scripts": {
17 | "test": "forge test -v",
18 | "build": "yarn && forge build"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "github.com/Layr-Labs/eigenda"
23 | },
24 | "author": "",
25 | "license": "ISC",
26 | "dependencies": {
27 | "@openzeppelin/contracts": "4.7.0",
28 | "@openzeppelin/contracts-upgradeable": "4.7.0"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/contracts/remappings.txt:
--------------------------------------------------------------------------------
1 | @openzeppelin/=node_modules/@openzeppelin/
--------------------------------------------------------------------------------
/contracts/script/EigenLayerUtils.s.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: BUSL-1.1
2 | pragma solidity =0.8.12;
3 |
4 | import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5 |
6 | import "forge-std/Script.sol";
7 | import "forge-std/StdJson.sol";
8 |
9 | contract EigenLayerUtils {
10 | function _allocate(IERC20 token, address[] memory tos, uint256[] memory amounts) internal {
11 | for (uint256 i = 0; i < tos.length; i++) {
12 | if (token == IERC20(address(0))) {
13 | payable(tos[i]).transfer(amounts[i]);
14 | } else {
15 | token.transfer(tos[i], amounts[i]);
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/contracts/script/deploy/certverifier/config/holesky/preprod.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "eigenDAServiceManager": "0x54A03db2784E3D0aCC08344D05385d0b62d4F432",
3 | "eigenDAThresholdRegistry": "0x41AEE4A23770045e9977CC9f964d3380D6Ff9e4E",
4 | "defaultSecurityThresholds": {
5 | "0_confirmationThreshold": 55,
6 | "1_adversaryThreshold": 33
7 | },
8 |
9 | "quorumNumbersRequired": "0x0001"
10 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/certverifier/config/holesky/testnet.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "eigenDAServiceManager": "0xD4A7E1Bd8015057293f0D0A557088c286942e84b",
3 | "eigenDAThresholdRegistry": "0x76d131CFBD900dA12f859a363Fb952eEDD1d1Ec1",
4 | "defaultSecurityThresholds": {
5 | "0_confirmationThreshold": 55,
6 | "1_adversaryThreshold": 33
7 | },
8 |
9 | "quorumNumbersRequired": "0x0001"
10 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/certverifier/config/sepolia/testnet.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "eigenDAServiceManager": "0x3a5acf46ba6890B8536420F4900AC9BC45Df4764",
3 | "eigenDAThresholdRegistry": "0x0DA66C1930Acc54809093Bb42f2e6a4bE21d5403",
4 | "defaultSecurityThresholds": {
5 | "0_confirmationThreshold": 55,
6 | "1_adversaryThreshold": 33
7 | },
8 |
9 | "quorumNumbersRequired": "0x0001"
10 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/certverifier/output/h.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/contracts/script/deploy/certverifier/output/h.txt
--------------------------------------------------------------------------------
/contracts/script/deploy/holesky/config/ejector.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "chainInfo": {
3 | "chainId": 17000
4 | },
5 |
6 | "permissions" : {
7 | "owner": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348",
8 | "ejector": "0xe93765d8462034C43B417e6081BC1e1572c7F55f",
9 | "fallbackEjector": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
10 | "deployer": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
11 | "emptyContract": "0x9690d52B1Ce155DB2ec5eCbF5a262ccCc7B3A6D2"
12 | },
13 |
14 | "quorumEjectionParams": [
15 | {
16 | "0_rateLimitWindow": 604800,
17 | "1_ejectableStakePercent": 3000
18 | },
19 | {
20 | "0_rateLimitWindow": 604800,
21 | "1_ejectableStakePercent": 3000
22 | }
23 | ]
24 |
25 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/mainnet/config/ejector.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "chainInfo": {
3 | "chainId": 1
4 | },
5 |
6 | "permissions" : {
7 | "owner": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
8 | "ejector": "0xD2Ee81Cf07B12140C793FcE5B26313CDd9d78eA8",
9 | "deployer": "0x45B866E099a790cbddA655Ca20Cb11168B2cD088",
10 | "emptyContract": "0x1f96861fEFa1065a5A96F20Deb6D8DC3ff48F7f9"
11 | },
12 |
13 | "quorumEjectionParams": [
14 | {
15 | "0_rateLimitWindow": 604800,
16 | "1_ejectableStakePercent": 3333
17 | },
18 | {
19 | "0_rateLimitWindow": 604800,
20 | "1_ejectableStakePercent": 3333
21 | }
22 | ]
23 |
24 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/router/config/example_config.json:
--------------------------------------------------------------------------------
1 | {
2 | "initialOwner": "0x0000000000000000000000000000000000000001",
3 | "initialCertVerifier": "0x0000000000000000000000000000000000000002",
4 | "proxyAdmin": "0x0000000000000000000000000000000000000003"
5 | }
--------------------------------------------------------------------------------
/contracts/script/deploy/verifiable/mocks/MockRegistryCoordinator.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: BUSL-1.1
2 |
3 | import {IStakeRegistry} from "lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol";
4 | import {IBLSApkRegistry} from "lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol";
5 |
6 | pragma solidity =0.8.12;
7 |
8 | // This mock is needed by the service manager contract's constructor
9 | contract MockRegistryCoordinator {
10 | IStakeRegistry public immutable stakeRegistry;
11 | IBLSApkRegistry public immutable blsApkRegistry;
12 |
13 | constructor(IStakeRegistry _stakeRegistry, IBLSApkRegistry _blsApkRegistry) {
14 | stakeRegistry = _stakeRegistry;
15 | blsApkRegistry = _blsApkRegistry;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/contracts/script/deploy/verifiable/mocks/MockStakeRegistry.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: BUSL-1.1
2 |
3 | import {IDelegationManager} from
4 | "lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol";
5 |
6 | pragma solidity =0.8.12;
7 |
8 | // This mock is needed by the service manager contract's constructor
9 | contract MockStakeRegistry {
10 | IDelegationManager public immutable delegation;
11 |
12 | constructor(IDelegationManager delegationManager) {
13 | delegation = delegationManager;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/contracts/script/input/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/contracts/script/input/.gitkeep
--------------------------------------------------------------------------------
/contracts/src/Imports.sol:
--------------------------------------------------------------------------------
1 | // Imports used for compiling for bindings for clients
2 | pragma solidity ^0.8.12;
3 |
4 | import "../lib/eigenlayer-middleware/src/OperatorStateRetriever.sol";
5 | import "../lib/eigenlayer-middleware/src/BLSApkRegistry.sol";
6 | import "../lib/eigenlayer-middleware/src/RegistryCoordinator.sol";
7 | import "../lib/eigenlayer-middleware/src/EjectionManager.sol";
8 |
--------------------------------------------------------------------------------
/contracts/src/core/EigenDADisperserRegistryStorage.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV2} from "src/core/libraries/v2/EigenDATypesV2.sol";
5 |
6 | /**
7 | * @title Storage variables for the `EigenDADisperserRegistry` contract.
8 | * @author Layr Labs, Inc.
9 | * @notice This storage contract is separate from the logic to simplify the upgrade process.
10 | */
11 | abstract contract EigenDADisperserRegistryStorage {
12 | mapping(uint32 => EigenDATypesV2.DisperserInfo) public disperserKeyToInfo;
13 |
14 | // storage gap for upgradeability
15 | // slither-disable-next-line shadowing-state
16 | uint256[49] private __GAP;
17 | }
18 |
--------------------------------------------------------------------------------
/contracts/src/core/EigenDARelayRegistryStorage.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV2} from "src/core/libraries/v2/EigenDATypesV2.sol";
5 |
6 | /**
7 | * @title Storage variables for the `EigenDARelayRegistry` contract.
8 | * @author Layr Labs, Inc.
9 | * @notice This storage contract is separate from the logic to simplify the upgrade process.
10 | */
11 | abstract contract EigenDARelayRegistryStorage {
12 | mapping(uint32 => EigenDATypesV2.RelayInfo) public relayKeyToInfo;
13 |
14 | uint32 public nextRelayKey;
15 |
16 | // storage gap for upgradeability
17 | // slither-disable-next-line shadowing-state
18 | uint256[48] private __GAP;
19 | }
20 |
--------------------------------------------------------------------------------
/contracts/src/core/interfaces/IEigenDABatchMetadataStorage.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | interface IEigenDABatchMetadataStorage {
5 | function batchIdToBatchMetadataHash(uint32 batchId) external view returns (bytes32);
6 | }
7 |
--------------------------------------------------------------------------------
/contracts/src/core/interfaces/IEigenDADisperserRegistry.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV2} from "src/core/libraries/v2/EigenDATypesV2.sol";
5 |
6 | interface IEigenDADisperserRegistry {
7 | event DisperserAdded(uint32 indexed key, address indexed disperser);
8 |
9 | function setDisperserInfo(uint32 _disperserKey, EigenDATypesV2.DisperserInfo memory _disperserInfo) external;
10 |
11 | function disperserKeyToAddress(uint32 key) external view returns (address);
12 | }
13 |
--------------------------------------------------------------------------------
/contracts/src/core/interfaces/IEigenDARelayRegistry.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV2} from "src/core/libraries/v2/EigenDATypesV2.sol";
5 |
6 | interface IEigenDARelayRegistry {
7 | event RelayAdded(address indexed relay, uint32 indexed key, string relayURL);
8 |
9 | function addRelayInfo(EigenDATypesV2.RelayInfo memory relayInfo) external returns (uint32);
10 |
11 | function relayKeyToAddress(uint32 key) external view returns (address);
12 |
13 | function relayKeyToUrl(uint32 key) external view returns (string memory);
14 | }
15 |
--------------------------------------------------------------------------------
/contracts/src/core/interfaces/IEigenDASignatureVerifier.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV1} from "src/core/libraries/v1/EigenDATypesV1.sol";
5 |
6 | interface IEigenDASignatureVerifier {
7 | function checkSignatures(
8 | bytes32 msgHash,
9 | bytes calldata quorumNumbers,
10 | uint32 referenceBlockNumber,
11 | EigenDATypesV1.NonSignerStakesAndSignature memory params
12 | ) external view returns (EigenDATypesV1.QuorumStakeTotals memory, bytes32);
13 | }
14 |
--------------------------------------------------------------------------------
/contracts/src/periphery/cert/EigenDACertTypes.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {EigenDATypesV1 as DATypesV1} from "src/core/libraries/v1/EigenDATypesV1.sol";
5 | import {EigenDATypesV2 as DATypesV2} from "src/core/libraries/v2/EigenDATypesV2.sol";
6 |
7 | /// @title EigenDACertTypes
8 | /// @notice This library defines the types for each EigenDA certificate version.
9 | /// @dev It is required that RBN be located in positions 32:64 (padded) in the ABI encoded certificate.
10 | library EigenDACertTypes {
11 | struct EigenDACertV3 {
12 | DATypesV2.BatchHeaderV2 batchHeader;
13 | DATypesV2.BlobInclusionInfo blobInclusionInfo;
14 | DATypesV1.NonSignerStakesAndSignature nonSignerStakesAndSignature;
15 | bytes signedQuorumNumbers;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/contracts/src/periphery/cert/interfaces/IEigenDACertVerifierBase.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | interface IEigenDACertVerifierBase {
5 | /// @notice Check a DA cert's validity
6 | /// @param abiEncodedCert The ABI encoded certificate. Any cert verifier should decode this ABI encoding based on the certificate version.
7 | /// @return status An enum value. Success is always mapped to 1, and other values are errors specific to each CertVerifier.
8 | function checkDACert(bytes calldata abiEncodedCert) external view returns (uint8 status);
9 | }
10 |
--------------------------------------------------------------------------------
/contracts/src/periphery/cert/interfaces/IEigenDACertVerifierRouter.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {IEigenDACertVerifierBase} from "src/periphery/cert/interfaces/IEigenDACertVerifierBase.sol";
5 |
6 | interface IEigenDACertVerifierRouter is IEigenDACertVerifierBase {
7 | /// @notice Returns the address for the active cert verifier at a given reference block number.
8 | /// The reference block number must not be in the future.
9 | function getCertVerifierAt(uint32 referenceBlockNumber) external view returns (address);
10 | }
11 |
--------------------------------------------------------------------------------
/contracts/src/periphery/cert/interfaces/IVersionedEigenDACertVerifier.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.9;
3 |
4 | import {IEigenDAThresholdRegistry} from "src/core/interfaces/IEigenDAThresholdRegistry.sol";
5 | import {IEigenDASignatureVerifier} from "src/core/interfaces/IEigenDASignatureVerifier.sol";
6 | import {IEigenDACertVerifierBase} from "src/periphery/cert/interfaces/IEigenDACertVerifierBase.sol";
7 | import {EigenDATypesV1 as DATypesV1} from "src/core/libraries/v1/EigenDATypesV1.sol";
8 |
9 | interface IVersionedEigenDACertVerifier {
10 | /// @notice Returns the EigenDA certificate version. Used off-chain to identify how to encode a certificate for this CertVerifier.
11 | /// @return The EigenDA certificate version.
12 | function certVersion() external view returns (uint8);
13 | }
14 |
--------------------------------------------------------------------------------
/core/indexer/errors.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrNotImplemented = errors.New("not implemented")
7 | ErrIncorrectObject = errors.New("incorrect object")
8 | ErrUnrecognizedFork = errors.New("unrecognized fork")
9 | ErrHeadersNotOrdered = errors.New("headers not ordered")
10 | ErrIncorrectEvent = errors.New("incorrect event payload")
11 | ErrOperatorNotFound = errors.New("operator not found")
12 | ErrWrongObjectFromIndexer = errors.New("indexer returned error of wrong type")
13 | )
14 |
--------------------------------------------------------------------------------
/core/indexer/upgrader.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | import "github.com/Layr-Labs/eigenda/indexer"
4 |
5 | type Upgrader struct {
6 | }
7 |
8 | // DetectUpgrade takes in a list of headers and sets the CurrentFork and IsUpgrade fields
9 | func (u *Upgrader) DetectUpgrade(headers indexer.Headers) indexer.Headers {
10 | for i := 0; i < len(headers); i++ {
11 | headers[i].CurrentFork = "genesis"
12 | }
13 | return headers
14 | }
15 |
16 | func (u *Upgrader) GetLatestUpgrade(header *indexer.Header) uint64 {
17 | return header.Number
18 | }
19 |
--------------------------------------------------------------------------------
/core/v2/auth.go:
--------------------------------------------------------------------------------
1 | package v2
2 |
3 | import (
4 | pb "github.com/Layr-Labs/eigenda/api/grpc/disperser/v2"
5 | gethcommon "github.com/ethereum/go-ethereum/common"
6 | )
7 |
8 | type BlobRequestAuthenticator interface {
9 | AuthenticateBlobRequest(header *BlobHeader, signature []byte) error
10 | AuthenticatePaymentStateRequest(accountId gethcommon.Address, request *pb.GetPaymentStateRequest) error
11 | AuthenticatePaymentStateForAllQuorumsRequest(accountId gethcommon.Address, request *pb.GetPaymentStateForAllQuorumsRequest) error
12 | }
13 |
14 | type BlobRequestSigner interface {
15 | SignBlobRequest(header *BlobHeader) ([]byte, error)
16 | SignPaymentStateRequest(timestamp uint64) ([]byte, error)
17 | GetAccountID() (gethcommon.Address, error)
18 | }
19 |
--------------------------------------------------------------------------------
/core/v2/blob_params.go:
--------------------------------------------------------------------------------
1 | package v2
2 |
3 | import (
4 | "github.com/Layr-Labs/eigenda/common"
5 | "github.com/Layr-Labs/eigenda/core"
6 | )
7 |
8 | type BlobVersionParameterMap = common.ReadOnlyMap[BlobVersion, *core.BlobVersionParameters]
9 |
10 | func NewBlobVersionParameterMap(params map[BlobVersion]*core.BlobVersionParameters) *BlobVersionParameterMap {
11 | return common.NewReadOnlyMap(params)
12 | }
13 |
--------------------------------------------------------------------------------
/core/v2/errors.go:
--------------------------------------------------------------------------------
1 | package v2
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrNotFound = errors.New("not found")
7 | )
8 |
--------------------------------------------------------------------------------
/disperser/.gitignore:
--------------------------------------------------------------------------------
1 | bin/*
2 | text
--------------------------------------------------------------------------------
/disperser/batcher/mock/finalizer.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/stretchr/testify/mock"
7 | )
8 |
9 | type MockFinalizer struct {
10 | mock.Mock
11 | }
12 |
13 | func NewFinalizer() *MockFinalizer {
14 | return &MockFinalizer{}
15 | }
16 |
17 | func (b *MockFinalizer) Start(ctx context.Context) {}
18 |
19 | func (b *MockFinalizer) FinalizeBlobs(ctx context.Context) error {
20 | args := b.Called()
21 | return args.Error(0)
22 | }
23 |
--------------------------------------------------------------------------------
/disperser/batcher/mock/txn_manager.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/Layr-Labs/eigenda/disperser/batcher"
7 | "github.com/stretchr/testify/mock"
8 | )
9 |
10 | type MockTxnManager struct {
11 | mock.Mock
12 |
13 | Requests []*batcher.TxnRequest
14 | }
15 |
16 | var _ batcher.TxnManager = (*MockTxnManager)(nil)
17 |
18 | func NewTxnManager() *MockTxnManager {
19 | return &MockTxnManager{}
20 | }
21 |
22 | func (b *MockTxnManager) Start(ctx context.Context) {}
23 |
24 | func (b *MockTxnManager) ProcessTransaction(ctx context.Context, req *batcher.TxnRequest) error {
25 | args := b.Called()
26 | b.Requests = append(b.Requests, req)
27 | return args.Error(0)
28 | }
29 |
30 | func (b *MockTxnManager) ReceiptChan() chan *batcher.ReceiptOrErr {
31 | args := b.Called()
32 | return args.Get(0).(chan *batcher.ReceiptOrErr)
33 | }
34 |
--------------------------------------------------------------------------------
/disperser/common/errors.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrBlobNotFound = errors.New("blob not found")
7 | ErrMetadataNotFound = errors.New("metadata not found")
8 | ErrAlreadyExists = errors.New("record already exists")
9 | )
10 |
--------------------------------------------------------------------------------
/disperser/common/v2/blobstore/errors.go:
--------------------------------------------------------------------------------
1 | package blobstore
2 |
3 | import "errors"
4 |
5 | var (
6 | ErrBlobNotFound = errors.New("blob not found")
7 | ErrMetadataNotFound = errors.New("metadata not found")
8 | ErrAlreadyExists = errors.New("record already exists")
9 | ErrInvalidStateTransition = errors.New("invalid state transition")
10 | )
11 |
--------------------------------------------------------------------------------
/disperser/common/v2/blobstore/s3_blob_store_test.go:
--------------------------------------------------------------------------------
1 | package blobstore_test
2 |
3 | import (
4 | "context"
5 | "testing"
6 |
7 | tu "github.com/Layr-Labs/eigenda/common/testutils"
8 | corev2 "github.com/Layr-Labs/eigenda/core/v2"
9 |
10 | "github.com/stretchr/testify/assert"
11 | )
12 |
13 | func TestStoreGetBlob(t *testing.T) {
14 | testBlobKey := corev2.BlobKey(tu.RandomBytes(32))
15 | err := blobStore.StoreBlob(context.Background(), testBlobKey, []byte("testBlobData"))
16 | assert.NoError(t, err)
17 | data, err := blobStore.GetBlob(context.Background(), testBlobKey)
18 | assert.NoError(t, err)
19 | assert.Equal(t, []byte("testBlobData"), data)
20 | }
21 |
22 | func TestGetBlobNotFound(t *testing.T) {
23 | testBlobKey := corev2.BlobKey(tu.RandomBytes(32))
24 | data, err := blobStore.GetBlob(context.Background(), testBlobKey)
25 | assert.Error(t, err)
26 | assert.Nil(t, data)
27 | }
28 |
--------------------------------------------------------------------------------
/disperser/controller/mock_blob_set.go:
--------------------------------------------------------------------------------
1 | package controller
2 |
3 | import (
4 | v2 "github.com/Layr-Labs/eigenda/core/v2"
5 | "github.com/stretchr/testify/mock"
6 | )
7 |
8 | type MockBlobSet struct {
9 | mock.Mock
10 | }
11 |
12 | func (q *MockBlobSet) AddBlob(blobKey v2.BlobKey) {
13 | _ = q.Called(blobKey)
14 | }
15 |
16 | func (q *MockBlobSet) RemoveBlob(blobKey v2.BlobKey) {
17 | _ = q.Called(blobKey)
18 | }
19 |
20 | func (q *MockBlobSet) Size() int {
21 | args := q.Called()
22 | return args.Int(0)
23 | }
24 |
25 | func (q *MockBlobSet) Contains(blobKey v2.BlobKey) bool {
26 | args := q.Called(blobKey)
27 | return args.Bool(0)
28 | }
29 |
--------------------------------------------------------------------------------
/disperser/controller/mock_node_client_manager.go:
--------------------------------------------------------------------------------
1 | package controller
2 |
3 | import (
4 | "github.com/Layr-Labs/eigenda/api/clients/v2"
5 | "github.com/stretchr/testify/mock"
6 | )
7 |
8 | type MockClientManager struct {
9 | mock.Mock
10 | }
11 |
12 | var _ NodeClientManager = (*MockClientManager)(nil)
13 |
14 | func (m *MockClientManager) GetClient(host, port string) (clients.NodeClient, error) {
15 | args := m.Called(host, port)
16 | client, _ := args.Get(0).(clients.NodeClient)
17 | return client, args.Error(1)
18 | }
19 |
--------------------------------------------------------------------------------
/disperser/dataapi/Makefile:
--------------------------------------------------------------------------------
1 | build:
2 | cd .. && go build -o ./bin/dataapi ./cmd/dataapi
3 |
4 | test:
5 | go test -v ./...
6 |
7 | generate-swagger-v1:
8 | @echo " > Generating v1 swagger..."
9 | swag init -g ../cmd/dataapi/main.go --parseDependency --output docs/v1 --instanceName V1 --packageName v1 --parseDepth 0 --exclude ./v2 --dir .
10 | swag fmt --dir . --exclude ./v2/server_v2.go
11 |
12 | generate-swagger-v2:
13 | @echo " > Generating v2 swagger..."
14 | swag init -g swagger.go --parseDependency --output docs/v2 --instanceName V2 --packageName v2 --dir ./v2 --parseDepth 0
15 | swag fmt --dir ./v2
16 |
17 | generate-swagger: generate-swagger-v1 generate-swagger-v2
18 |
--------------------------------------------------------------------------------
/disperser/dataapi/config.go:
--------------------------------------------------------------------------------
1 | package dataapi
2 |
3 | type Config struct {
4 | SocketAddr string
5 | ServerMode string
6 | AllowOrigins []string
7 | DisperserHostname string
8 | ChurnerHostname string
9 | BatcherHealthEndpt string
10 | }
11 |
12 | type DataApiVersion uint
13 |
14 | const (
15 | V1 DataApiVersion = 1
16 | V2 DataApiVersion = 2
17 | )
18 |
--------------------------------------------------------------------------------
/disperser/dataapi/prometheus/config.go:
--------------------------------------------------------------------------------
1 | package prometheus
2 |
3 | type Config struct {
4 | ServerURL string
5 | Username string
6 | Secret string
7 | Cluster string
8 | }
9 |
--------------------------------------------------------------------------------
/disperser/dataapi/prometheus/mock/api.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 | "time"
6 |
7 | "github.com/Layr-Labs/eigenda/disperser/dataapi/prometheus"
8 | v1 "github.com/prometheus/client_golang/api/prometheus/v1"
9 | "github.com/prometheus/common/model"
10 | "github.com/stretchr/testify/mock"
11 | )
12 |
13 | type MockPrometheusApi struct {
14 | mock.Mock
15 | }
16 |
17 | var _ prometheus.Api = (*MockPrometheusApi)(nil)
18 |
19 | func (m *MockPrometheusApi) QueryRange(ctx context.Context, query string, start time.Time, end time.Time, step time.Duration) (model.Value, v1.Warnings, error) {
20 | args := m.Called()
21 | var value model.Value
22 | if args.Get(0) != nil {
23 | value = args.Get(0).(model.Value)
24 | }
25 | var warnings v1.Warnings
26 | if args.Get(1) != nil {
27 | warnings = args.Get(1).(v1.Warnings)
28 | }
29 | return value, warnings, args.Error(2)
30 | }
31 |
--------------------------------------------------------------------------------
/disperser/dataapi/v2/swagger.go:
--------------------------------------------------------------------------------
1 | package v2
2 |
3 | // @title EigenDA Data Access API V2
4 | // @version 2.0
5 | // @description This is the EigenDA Data Access API V2 server.
6 | // @BasePath /api/v2
7 | // @schemes https http
8 |
9 | // SwaggerV2Doc holds swagger docs for v2
10 | func SwaggerV2Doc() {
11 | // This function exists solely to hold the swagger docs
12 | // It should never be called
13 | }
14 |
--------------------------------------------------------------------------------
/disperser/encoder/config.go:
--------------------------------------------------------------------------------
1 | package encoder
2 |
3 | const (
4 | Localhost = "0.0.0.0"
5 | )
6 |
7 | type ServerConfig struct {
8 | GrpcPort string
9 | MaxConcurrentRequests int
10 | RequestPoolSize int
11 | RequestQueueSize int
12 | EnableGnarkChunkEncoding bool
13 | PreventReencoding bool
14 | Backend string
15 | GPUEnable bool
16 | PprofHttpPort string
17 | EnablePprof bool
18 | }
19 |
--------------------------------------------------------------------------------
/disperser/encoder_client.go:
--------------------------------------------------------------------------------
1 | package disperser
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/Layr-Labs/eigenda/core"
7 | "github.com/Layr-Labs/eigenda/encoding"
8 | )
9 |
10 | type EncoderClient interface {
11 | EncodeBlob(ctx context.Context, data []byte, encodingParams encoding.EncodingParams) (*encoding.BlobCommitments, *core.ChunksData, error)
12 | }
13 |
--------------------------------------------------------------------------------
/disperser/encoder_client_v2.go:
--------------------------------------------------------------------------------
1 | package disperser
2 |
3 | import (
4 | "context"
5 |
6 | corev2 "github.com/Layr-Labs/eigenda/core/v2"
7 | "github.com/Layr-Labs/eigenda/encoding"
8 | )
9 |
10 | type EncoderClientV2 interface {
11 | EncodeBlob(ctx context.Context, blobKey corev2.BlobKey, encodingParams encoding.EncodingParams, blobSize uint64) (*encoding.FragmentInfo, error)
12 | }
13 |
--------------------------------------------------------------------------------
/disperser/mock/encoder_v2.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 |
6 | corev2 "github.com/Layr-Labs/eigenda/core/v2"
7 | "github.com/Layr-Labs/eigenda/disperser"
8 | "github.com/Layr-Labs/eigenda/encoding"
9 | "github.com/stretchr/testify/mock"
10 | )
11 |
12 | type MockEncoderClientV2 struct {
13 | mock.Mock
14 | }
15 |
16 | var _ disperser.EncoderClientV2 = (*MockEncoderClientV2)(nil)
17 |
18 | func NewMockEncoderClientV2() *MockEncoderClientV2 {
19 | return &MockEncoderClientV2{}
20 | }
21 |
22 | func (m *MockEncoderClientV2) EncodeBlob(ctx context.Context, blobKey corev2.BlobKey, encodingParams encoding.EncodingParams, blobSize uint64) (*encoding.FragmentInfo, error) {
23 | args := m.Called()
24 | var fragmentInfo *encoding.FragmentInfo
25 | if args.Get(0) != nil {
26 | fragmentInfo = args.Get(0).(*encoding.FragmentInfo)
27 | }
28 | return fragmentInfo, args.Error(1)
29 | }
30 |
--------------------------------------------------------------------------------
/disperser/server_config.go:
--------------------------------------------------------------------------------
1 | package disperser
2 |
3 | import "time"
4 |
5 | const (
6 | Localhost = "0.0.0.0"
7 | )
8 |
9 | type ServerConfig struct {
10 | GrpcPort string
11 | GrpcTimeout time.Duration
12 |
13 | PprofHttpPort string
14 | EnablePprof bool
15 | }
16 |
--------------------------------------------------------------------------------
/docs/audits/Sigma_Prime_EigenDA_Offchain_Security_Assessment_Report.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/audits/Sigma_Prime_EigenDA_Offchain_Security_Assessment_Report.pdf
--------------------------------------------------------------------------------
/docs/spec/.gitignore:
--------------------------------------------------------------------------------
1 | book
2 |
--------------------------------------------------------------------------------
/docs/spec/Makefile:
--------------------------------------------------------------------------------
1 | # Serves the mdbook docs located in this directory.
2 | # Will open a browser window to view the docs.
3 | serve: install-deps
4 | mdbook serve . --open
5 |
6 | build: install-deps
7 | mdbook build
8 |
9 | install-deps:
10 | cargo install mdbook mdbook-mermaid@0.14.1
--------------------------------------------------------------------------------
/docs/spec/book.toml:
--------------------------------------------------------------------------------
1 | [book]
2 | authors = ["Samuel Laferriere"]
3 | language = "en"
4 | multilingual = false
5 | src = "src"
6 | title = "EigenDA Spec"
7 |
8 | [output.html]
9 | mathjax-support = true
10 | additional-js = ["mermaid.min.js", "mermaid-init.js"]
11 |
12 | [preprocessor]
13 |
14 | [preprocessor.mermaid]
15 | # Preprocesses the mermaid diagrams (see src/integration/proxy.md for an example)
16 | # and generates the corresponding SVG files.
17 | # See https://github.com/badboy/mdbook-mermaid for more information.
18 | # This requires the mdbook-mermaid crate to be installed.
19 | command = "mdbook-mermaid"
20 |
--------------------------------------------------------------------------------
/docs/spec/src/assets/architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/architecture.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/assignment-module.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/assignment-module.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/attestation-layer-parts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/attestation-layer-parts.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/attestation-layer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/attestation-layer.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/blazar-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/blazar-diagram.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/bridging-module.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/bridging-module.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/encoding-groups.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/encoding-groups.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/encoding-module.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/encoding-module.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/blob-certificate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/blob-certificate.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/cert-rbn-recency-window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/cert-rbn-recency-window.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/contracts-eigenda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/contracts-eigenda.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/contracts-rollup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/contracts-rollup.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/high-level-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/high-level-diagram.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/op-integration-high-level.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/op-integration-high-level.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/payload-to-blob-encoding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/payload-to-blob-encoding.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/recency-window-timeline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/recency-window-timeline.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/rollup-proxy-da-integration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/rollup-proxy-da-integration.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/ultra-high-res-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/ultra-high-res-diagram.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/v2-batch-hashing-structure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/v2-batch-hashing-structure.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/integration/v2-cert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/integration/v2-cert.png
--------------------------------------------------------------------------------
/docs/spec/src/assets/network-layer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/docs/spec/src/assets/network-layer.png
--------------------------------------------------------------------------------
/docs/spec/src/integration.md:
--------------------------------------------------------------------------------
1 | # EigenDA Integrations
2 |
3 | This book is meant to be read by eigenda and rollup developers who are writing or extending an integration with EigenDA.
4 | Users and developers who just want to understand how an integration works at a high level, and need to learn
5 | how to configure their own integration, should instead visit our [Integrations Guides](https://docs.eigenda.xyz/integrations-guides/overview).
--------------------------------------------------------------------------------
/docs/spec/src/protocol.md:
--------------------------------------------------------------------------------
1 | # EigenDA Protocol
2 |
3 | Broken down into 2 main sections.
4 |
5 | ## Core Services
6 |
7 | EigenDA Protocol consists of a suite of services that allow for data to be securely stored and retrieved from the validators.
8 |
9 | 
10 |
11 | ## Contracts
--------------------------------------------------------------------------------
/docs/spec/src/v1.md:
--------------------------------------------------------------------------------
1 | # V1
2 |
3 | Link to previous documentation?
--------------------------------------------------------------------------------
/encoding/bench/Makefile:
--------------------------------------------------------------------------------
1 | build_cpu:
2 | go build -gcflags="all=-N -l" -ldflags="-s=false -w=false" -o bin/main main.go
3 |
4 | build_icicle:
5 | go build -tags=icicle -gcflags="all=-N -l" -ldflags="-s=false -w=false" -o bin/main_icicle main.go
6 |
7 | benchmark_default:
8 | go run main.go -cpuprofile cpu.prof -memprofile mem.prof
9 |
10 | benchmark_icicle:
11 | go run -tags=icicle main.go -cpuprofile cpu.prof -memprofile mem.prof
12 |
13 | cpu_profile:
14 | go tool pprof -http=:8080 cpu.prof
15 |
16 | mem_profile:
17 | go tool pprof -http=:8080 mem.prof
18 |
--------------------------------------------------------------------------------
/encoding/kzg/constants.go:
--------------------------------------------------------------------------------
1 | package kzg
2 |
3 | import (
4 | "github.com/consensys/gnark-crypto/ecc/bn254"
5 | )
6 |
7 | func init() {
8 | initG1G2()
9 | }
10 |
11 | var GenG1 bn254.G1Affine
12 | var GenG2 bn254.G2Affine
13 |
14 | var ZeroG1 bn254.G1Affine
15 | var ZeroG2 bn254.G2Affine
16 |
17 | func initG1G2() {
18 |
19 | _, _, genG1, genG2 := bn254.Generators()
20 |
21 | GenG1 = *(*bn254.G1Affine)(&genG1)
22 | GenG2 = *(*bn254.G2Affine)(&genG2)
23 |
24 | var g1Jac bn254.G1Jac
25 | g1Jac.X.SetZero()
26 | g1Jac.Y.SetOne()
27 | g1Jac.Z.SetZero()
28 |
29 | var g1Aff bn254.G1Affine
30 | g1Aff.FromJacobian(&g1Jac)
31 | ZeroG1 = *(*bn254.G1Affine)(&g1Aff)
32 |
33 | var g2Jac bn254.G2Jac
34 | g2Jac.X.SetZero()
35 | g2Jac.Y.SetOne()
36 | g2Jac.Z.SetZero()
37 | var g2Aff bn254.G2Affine
38 | g2Aff.FromJacobian(&g2Jac)
39 | ZeroG2 = *(*bn254.G2Affine)(&g2Aff)
40 | }
41 |
--------------------------------------------------------------------------------
/encoding/kzg/kzgrs.go:
--------------------------------------------------------------------------------
1 | package kzg
2 |
3 | type KzgConfig struct {
4 | G1Path string
5 | G2Path string
6 | G2TrailingPath string
7 | G1PowerOf2Path string
8 | G2PowerOf2Path string
9 | CacheDir string
10 | NumWorker uint64
11 | SRSOrder uint64 // Order is the total size of SRS
12 | SRSNumberToLoad uint64 // Number of points to be loaded from the beginning
13 | Verbose bool
14 | PreloadEncoder bool
15 | LoadG2Points bool
16 | }
17 |
--------------------------------------------------------------------------------
/encoding/kzg/prover/decode.go:
--------------------------------------------------------------------------------
1 | package prover
2 |
3 | import (
4 | enc "github.com/Layr-Labs/eigenda/encoding"
5 | "github.com/Layr-Labs/eigenda/encoding/rs"
6 | )
7 |
8 | func (g *ParametrizedProver) Decode(frames []enc.Frame, indices []uint64, maxInputSize uint64) ([]byte, error) {
9 | rsFrames := make([]rs.FrameCoeffs, len(frames))
10 | for ind, frame := range frames {
11 | rsFrames[ind] = frame.Coeffs
12 | }
13 |
14 | return g.Encoder.Decode(rsFrames, indices, maxInputSize, g.EncodingParams)
15 | }
16 |
--------------------------------------------------------------------------------
/encoding/kzg/prover/noicicle.go:
--------------------------------------------------------------------------------
1 | //go:build !icicle
2 |
3 | package prover
4 |
5 | import (
6 | "errors"
7 |
8 | "github.com/Layr-Labs/eigenda/encoding"
9 | "github.com/Layr-Labs/eigenda/encoding/fft"
10 | "github.com/Layr-Labs/eigenda/encoding/kzg"
11 | )
12 |
13 | func CreateIcicleBackendProver(p *Prover, params encoding.EncodingParams, fs *fft.FFTSettings, ks *kzg.KZGSettings) (*ParametrizedProver, error) {
14 | // Not supported
15 | return nil, errors.New("icicle backend called without icicle build tag")
16 | }
17 |
--------------------------------------------------------------------------------
/encoding/kzg/prover/proof_backend.go:
--------------------------------------------------------------------------------
1 | package prover
2 |
3 | import (
4 | "github.com/consensys/gnark-crypto/ecc/bn254"
5 | "github.com/consensys/gnark-crypto/ecc/bn254/fr"
6 | )
7 |
8 | // Proof device represents a backend capable of computing KZG multiproofs.
9 | type KzgMultiProofsBackend interface {
10 | ComputeMultiFrameProof(blobFr []fr.Element, numChunks, chunkLen, numWorker uint64) ([]bn254.G1Affine, error)
11 | }
12 |
13 | // CommitmentDevice represents a backend capable of computing various KZG commitments.
14 | type KzgCommitmentsBackend interface {
15 | ComputeCommitment(coeffs []fr.Element) (*bn254.G1Affine, error)
16 | ComputeLengthCommitment(coeffs []fr.Element) (*bn254.G2Affine, error)
17 | ComputeLengthProof(coeffs []fr.Element) (*bn254.G2Affine, error)
18 | ComputeLengthProofForLength(blobFr []fr.Element, length uint64) (*bn254.G2Affine, error)
19 | }
20 |
--------------------------------------------------------------------------------
/encoding/rs/gnark/extend_poly.go:
--------------------------------------------------------------------------------
1 | package gnark
2 |
3 | import (
4 | "github.com/Layr-Labs/eigenda/encoding/fft"
5 | "github.com/consensys/gnark-crypto/ecc/bn254/fr"
6 | )
7 |
8 | type RsGnarkBackend struct {
9 | Fs *fft.FFTSettings
10 | }
11 |
12 | // Encoding Reed Solomon using FFT
13 | func (g *RsGnarkBackend) ExtendPolyEval(coeffs []fr.Element) ([]fr.Element, error) {
14 | evals, err := g.Fs.FFT(coeffs, false)
15 | if err != nil {
16 | return nil, err
17 | }
18 |
19 | return evals, nil
20 | }
21 |
--------------------------------------------------------------------------------
/encoding/rs/noicicle.go:
--------------------------------------------------------------------------------
1 | //go:build !icicle
2 |
3 | package rs
4 |
5 | import (
6 | "errors"
7 |
8 | "github.com/Layr-Labs/eigenda/encoding"
9 | "github.com/Layr-Labs/eigenda/encoding/fft"
10 | )
11 |
12 | func CreateIcicleBackendEncoder(p *Encoder, params encoding.EncodingParams, fs *fft.FFTSettings) (*ParametrizedEncoder, error) {
13 | // Not supported
14 | return nil, errors.New("icicle backend called without icicle build tag")
15 | }
16 |
--------------------------------------------------------------------------------
/encoding/test/README.md:
--------------------------------------------------------------------------------
1 | # encoding
2 |
3 |
4 | - performs Reed Solomon Encoding using elliptic curve points. The library enables KZG multi-proof and reveal in O(n log n) time using FFT, based on FK20 algorithm.
5 |
6 | - is built upon crypto primitive from https://pkg.go.dev/github.com/protolambda/go-kzg
7 |
8 | - accepts arbitrary number of systematic nodes, parity nodes and data size, free of restriction on power of 2
9 |
--------------------------------------------------------------------------------
/encoding/test_utils.go:
--------------------------------------------------------------------------------
1 | package encoding
2 |
3 | import (
4 | "golang.org/x/exp/constraints"
5 | )
6 |
7 | // GeneratePowersOfTwo creates a slice of integers, containing powers of 2 (starting with element == 1), with
8 | // powersToGenerate number of elements
9 | func GeneratePowersOfTwo[T constraints.Integer](powersToGenerate T) []T {
10 | powers := make([]T, powersToGenerate)
11 | for i := T(0); i < powersToGenerate; i++ {
12 | powers[i] = 1 << i
13 | }
14 |
15 | return powers
16 | }
17 |
--------------------------------------------------------------------------------
/encoding/utils_test.go:
--------------------------------------------------------------------------------
1 | package encoding
2 |
3 | import (
4 | "testing"
5 |
6 | "github.com/stretchr/testify/require"
7 | )
8 |
9 | func TestNextPowerOf2(t *testing.T) {
10 | testHeight := 65536
11 |
12 | // 2 ^ 16 = 65536
13 | // i.e., the last element generated here == testHeight
14 | powers := GeneratePowersOfTwo(17)
15 |
16 | powerIndex := 0
17 | for i := 1; i <= testHeight; i++ {
18 | nextPowerOf2 := NextPowerOf2(i)
19 | require.Equal(t, nextPowerOf2, powers[powerIndex])
20 |
21 | if i == powers[powerIndex] {
22 | powerIndex++
23 | }
24 | }
25 |
26 | // sanity check the test logic
27 | require.Equal(t, powerIndex, len(powers))
28 |
29 | // extra sanity check, since we *really* rely on NextPowerOf2 returning
30 | // the same value, if it's already a power of 2
31 | require.Equal(t, 16, NextPowerOf2(16))
32 | }
33 |
--------------------------------------------------------------------------------
/inabox/.gitignore:
--------------------------------------------------------------------------------
1 | data/
2 |
--------------------------------------------------------------------------------
/inabox/anvil/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | anvil:
4 | image: ghcr.io/foundry-rs/foundry:v1.0.0
5 | ports:
6 | - 8545:8545
7 | networks:
8 | - eigenda-demo
9 | command: ["anvil --host 0.0.0.0"]
10 | networks:
11 | eigenda-demo:
12 | name: eigenda-demo
13 |
--------------------------------------------------------------------------------
/inabox/create-s3-bucket.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | S3_BUCKET="test-eigenda-blobstore"
5 | S3_REGION="us-east-1"
6 |
7 | if AWS_ACCESS_KEY_ID=localstack AWS_SECRET_ACCESS_KEY=localstack \
8 | aws s3api head-bucket --endpoint-url=$AWS_URL --bucket "$S3_BUCKET" 2>/dev/null; then
9 | echo "Bucket $S3_BUCKET already exists"
10 | else
11 | echo "Creating bucket $S3_BUCKET"
12 | AWS_ACCESS_KEY_ID=localstack AWS_SECRET_ACCESS_KEY=localstack aws s3api create-bucket \
13 | --endpoint-url=$AWS_URL \
14 | --bucket "$S3_BUCKET" \
15 | --region "$S3_REGION"
16 | fi
17 |
--------------------------------------------------------------------------------
/inabox/deploy/codegen/gen.sh:
--------------------------------------------------------------------------------
1 | go run .
2 | cd ../ && gofmt -s -w .
--------------------------------------------------------------------------------
/inabox/geth/.env:
--------------------------------------------------------------------------------
1 | GETH_CHAINID=40525
2 | GETH_UNLOCK_ADDRESS=3aa273f6c6df3a8498ebdcdd241a2575e08cde64
--------------------------------------------------------------------------------
/inabox/geth/.gitignore:
--------------------------------------------------------------------------------
1 | data
2 |
--------------------------------------------------------------------------------
/inabox/geth/get-revert.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker exec geth sh -c "cd /root/.ethereum/ && geth --exec 'tx = eth.getTransaction(\"$1\"); eth.call(tx,tx.blockNumber)' attach geth.ipc"
4 |
5 |
--------------------------------------------------------------------------------
/inabox/geth/secret/geth-account-password:
--------------------------------------------------------------------------------
1 | not-a-secret-hmwUHAxZ0yog6vaKYRS3nLwMR5luMMNVHTn6Toyzgl8
2 |
--------------------------------------------------------------------------------
/inabox/node-plugin.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | go mod tidy
4 | go build -o ../node/plugin/bin/nodeplugin ../node/plugin/cmd
5 | ../node/plugin/bin/nodeplugin
6 |
7 |
8 |
--------------------------------------------------------------------------------
/inabox/ratelimit.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | for ((i=0;i<10;i++)); do
4 | # Generate 1KB of random data and store it in a variable called "data"
5 | # The data is stored in hex format
6 | data=$(printf '1%.0s' {1..1000} | base64 | tr -d '\n')
7 | grpcurl -plaintext -d "{\"data\": \"$data\", \"security_params\": [{\"quorum_id\": 0, \"adversary_threshold\": 50, \"quorum_threshold\": 100}]}" localhost:32003 disperser.Disperser/DisperseBlob
8 | sleep 0.5
9 | done
10 |
11 |
--------------------------------------------------------------------------------
/inabox/resources/kzg/g1.point:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g1.point
--------------------------------------------------------------------------------
/inabox/resources/kzg/g1.point.300000:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g1.point.300000
--------------------------------------------------------------------------------
/inabox/resources/kzg/g2.point:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g2.point
--------------------------------------------------------------------------------
/inabox/resources/kzg/g2.point.300000:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g2.point.300000
--------------------------------------------------------------------------------
/inabox/resources/kzg/g2.point.300000.powerOf2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g2.point.300000.powerOf2
--------------------------------------------------------------------------------
/inabox/resources/kzg/g2.point.powerOf2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/resources/kzg/g2.point.powerOf2
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/1.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([19408553463882111916887171276012224475029133183214861480489485386352635269635,17418827901203159022109906145273000034647571131322064812191371351028964064220])","crypto":{"cipher":"aes-128-ctr","ciphertext":"f2e5a3df524234426297f84b80c3c69e008ca17960fa512845b250a5308a7a6c","cipherparams":{"iv":"64528130796bc7227f48b0b01030b4c2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7ceca78a0011e3ab5dce8b4f562b0615f60d8642b841d751bc676fb7dc574938"},"mac":"f9e5050e1077e2558a66f82fad05259ebc9e81da6e5ef8025f34d8fbc7e6e8ac"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/10.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([20033409541027087898996013771015099400853424042652173285582728583342902337204,8416926931350553541792180249382124323637891725898225988928698524457350547010])","crypto":{"cipher":"aes-128-ctr","ciphertext":"58548f8ec4485ab038b1720a557f24b0f0c0ef6a93b0d96c33987e4c798c57f5","cipherparams":{"iv":"882d3a1bb323249eee50eb29fc8305c3"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8b46adbb03cc578c824a405fd4b8341c9dd7dc963b94d0469f953d36a3091ba5"},"mac":"6871e231c5adcf392c1f7cd64a4847f8637f816318a089d429b4a33253256a10"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/11.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([15502524601299916150245655233543504409193146014048710197277977261608811399255,14153842553566963645735714104720254516908385743823296858687275901813164519452])","crypto":{"cipher":"aes-128-ctr","ciphertext":"0a54ac7ec8a3cd6326a0303acbe1bd078fdeca29976f4c1e218c8f36f2c24f9d","cipherparams":{"iv":"c19f09077e498b80a4060894e0c0596c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"f668e0fa1f5b333560625355dd260cc1fe569d4e3c172fa1bff2e40286d2987d"},"mac":"7fb80682707f2e2f2239c85a435060438633725a88a57e9c3a45bd2caf163fc0"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/12.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([19009689770016361008874792588161204898256643176830095028466269435894493868298,4912523978018349909704186140526655471803096217359334026755399239052745641211])","crypto":{"cipher":"aes-128-ctr","ciphertext":"a97ccaa6e75482758a7402bde272a10c20dcf1bbf2ca29ef7cbbe426ccf6f079","cipherparams":{"iv":"d6bf0335fd1ba91e868b99d87084c2df"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"69ac9c65923484c1c0f91acb7e9d251d4a7b501fc13ae0f2b2ceda3de4e2afbc"},"mac":"953b45a0162c5e72ac4354ae303758ebfcc0b0b7154a937dbe49b6e8e7051ecd"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/13.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([11865866222739240520202720723084025794427398361251258363778734130543871337026,21865821699390548202156622413426869512020811304738537869411524407418522130817])","crypto":{"cipher":"aes-128-ctr","ciphertext":"4e62016153f7a58de186eb4e87c3e347e60d9efbd8877b8c2f17142f21bf50a9","cipherparams":{"iv":"34ce083131884470f0a94587c0e29df0"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"4b850bde4fb9b22fff326236bb92cbc615c2df586d9ec8f005cefb0a12a1f2e7"},"mac":"b90a0dacb7b144e2bfd4a233515994d440c6016f7a28f2ecf14be55d0ce84cd9"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/14.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([4170044650287645380007257573020871410146338308102297291163569597744671189461,14862370309568996594590751054295513494064434496409357401358399319477797787354])","crypto":{"cipher":"aes-128-ctr","ciphertext":"4e0099e1cf85735aed2838150e661a652b228eb2999306d1e9404a2be7fbba87","cipherparams":{"iv":"86732f8e4f429c9680a4c5707ffd516b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5e901ea4879ac81528476ee15cca8ecd30b8886d7ede0b93a49c5843ba09d968"},"mac":"a3ec59cc1fb4838c494d9f83b33fe88d76f0fcf97cdec60c3101e99c2da3b53c"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/15.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([4778508791671878707696625341757108045469823747457849397057211199876782613140,436650946239391756088160092786429646505273196934632454665576473951248571856])","crypto":{"cipher":"aes-128-ctr","ciphertext":"8c6bb9c0671cce81492c2b4fd874be8a2ccb7341c9b5a1d421157e6882f46a86","cipherparams":{"iv":"6d6d272371bd18d2b641020fabd85046"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"82018e43f2493609c70eafe273c461083d25b51c05c705897e4dfe715ee16944"},"mac":"61a119e443d34bb4af771a78ee0add34e130647ee95b63175e792bd356d486bd"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/16.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([1774947307409682024232743159557093339555515859683543874764588099792165762450,2232650464846518366181702807340869181905349571621858816472725033095954625359])","crypto":{"cipher":"aes-128-ctr","ciphertext":"211828753077fbc9ac9f736e4f5238aff1ec2b875c415d17991c84aab2f5b622","cipherparams":{"iv":"cdfd6728b58fcf1cee22fefc59692ec3"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"df49247875627f0251dead386f6c7842a6cfc9a610f6f6fd5402dbee93007498"},"mac":"8ba8f25c756b2268fda1695785e0ba367f26fc5449485a53a0dd60ae7e2f3a83"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/17.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([3292787205237787786404181949764862423868540994315986995739065457522354359450,5705885397989773263704230122447348805954131884083482715712697241126273466490])","crypto":{"cipher":"aes-128-ctr","ciphertext":"c936991848341be8314affb469192f323ba04cb5c263e4d5f7d95b90f2ad86ef","cipherparams":{"iv":"ee0dcc334827792482a9a631e94c340b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8a4665a2600c7ea2d763618ecda82920e8e84e0995cbc85e1f1374e34ec0fa77"},"mac":"09b781fcc420bc6d44816ee62452ec993b44028e113194349d69b438b20f73d6"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/18.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([17662341945116438437372260978705417746694081322033088584589556765447179368866,11499377907443342629295584958700515883694730608180219279391253015189625425210])","crypto":{"cipher":"aes-128-ctr","ciphertext":"bf687ede9c2cd36f853271a0bac32b273c550859922fab6974d8b3b159778da9","cipherparams":{"iv":"0006f3e99a935cb07e3a81bacc8286bf"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"ae6e04af34321d8cdf9e8fed9f5ef8f15d09be40def1e4bb35b629dcc3a2f724"},"mac":"6e42154ebd4b1378ef96860e70a5e3a2c6a9ca1e5af670a113d41063343f7cdd"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/19.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([6468037626967245517319378401142610731388673156871748053341480709801747198875,5417212409640004026554663172732175455404352775439714083798919870258332316627])","crypto":{"cipher":"aes-128-ctr","ciphertext":"97a59c1f90f15117656c2765f4f3fd92c2a8a0f0e632dc0ca5b9ffcf7158018f","cipherparams":{"iv":"61eb077fc0c2c1874f3a209147e3f909"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"240b6ce6bb4dbd112bcb6bfe2f00a5ad001ae3652cfa3833dc0bc69b988175b1"},"mac":"a7428c8c0a1cf67a2c6a285b43c3df0bc588488b0984f4f2a0a1e147906a1a05"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/2.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([1611472477336575391907540595283981736749839435478357492584206660415845982634,17740534282163859696734712865013083642718796435843138137894885755851743300823])","crypto":{"cipher":"aes-128-ctr","ciphertext":"d6dd67cddc77447c63b3bba2a1ffb115af151a31c3a9811b40b7b3b965799402","cipherparams":{"iv":"bf935b67d026db7f0502a46b8e35bddd"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"85c1c9b32e1182b5d769cce7005b00f5c64eec2537636e8b2a3d125083bc8ef6"},"mac":"b398381ce566074af656237d71be1551254f8824221690b59dd9bcdbcb409055"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/20.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([5321928503098549071144871780170782893592499614062793259604054757590399860255,8401170400834122764849845076483272340954616640180545821685966380462394304641])","crypto":{"cipher":"aes-128-ctr","ciphertext":"603ec876ee064a46d1f5e1b67a297664ee20bb130c83a9eb4cf7781c3ab7ca34","cipherparams":{"iv":"a0d426740d346eb75eabcd29bf0b110e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"1dcdac3ad07e3eb7985de1e15b50ee2ba5b98bca5782ee034fd78d6ccdec822f"},"mac":"18f044948e944a81dede03a283588383fed744025bfcaf22e5267f05f7174d3d"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/21.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([3524922105389497027532498842087977614646368645154131179932294105973095821043,5962939692567729054218075115988509248001064588529118334928421836165015323343])","crypto":{"cipher":"aes-128-ctr","ciphertext":"972918725dc6cca265640b363c14197b4a29e344d88e419d6f11ebb94bf84daa","cipherparams":{"iv":"de12b4c4afa4c1a98f103fd82e852206"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"18a697569c0dbe48ab559047a0550a7923c38d548647c37abd69597e7069bd02"},"mac":"b0afbd653a1a0f9ef7dce7daee3a08a79831dbe219723999600d01161d7cf01f"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/22.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([11471892416773457407091068942788497959257224091607815828153304296045519114880,14140073466323338932172175861726747362569681611532276660372516139806264668876])","crypto":{"cipher":"aes-128-ctr","ciphertext":"e1e49f792ff58c5a0cce973a3aad8c9e01773e72ffb0230320acf640869d9ee8","cipherparams":{"iv":"dc07986599284c8e29797a967ba84d63"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"45200f81f74e5bbe900cd9564053287fecc41528a1e791468716bc38fcebf5b8"},"mac":"3298380e8a9eb8f17317fa033769a2644e917c7725d872194902b80e794de417"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/23.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([8615396526982290483716822796719588690664151189844094144250101991232017031766,4068376951340680645482646101040130753787448653498753043705254185356387670245])","crypto":{"cipher":"aes-128-ctr","ciphertext":"725959e5b8edc442e634a4bfc313f0c4a1fa6ad330b74c4ec8b0efd560a67530","cipherparams":{"iv":"9d49d9b0f50108566514a9f9fca3bd6c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2367b66a60d876906317a45d98d5190873d2ea8ef21b0b71c17570e18ffb4b6b"},"mac":"dea952abbd34f1ec026828c4b756c3ad881e93c9b2320cc85f634b4dc28c9d78"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/24.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([7821807743331815964877297788616887822098209160179239882064957823554483982886,4561300339252835354522579034779040885322431581276553896860750987138688478123])","crypto":{"cipher":"aes-128-ctr","ciphertext":"ce06cc5a24f88e371a4542947bf8b0e32dcb522a87bf63f3d0ec044056cc577a","cipherparams":{"iv":"72cf7944231cb0a53d0cdd47be88fd8c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"bb8ab267a4e7a63d833319d4589b9cdfba2d15d5a4ef1df93affaeb2ee94520d"},"mac":"5afdebb7343c12c59fb3f912da40a7eb63fac3bfda2e3aea9b517ec3be4d1c58"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/25.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([17457351878230120628732659494308320329195458083282464989581298203528036820947,18108457133599756998482128651546146875085258076477544622327461656239151731258])","crypto":{"cipher":"aes-128-ctr","ciphertext":"6c4fb68804bde73c0476ca57fb0be4b8b0bac72a622e9e26e0a92aa0d6dda3e8","cipherparams":{"iv":"32dbe657774ef412844f1d617cdca8d5"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"d9e64773d5ee16eb8bf0d4838a3c4390876367caa6405e2e7c63e35a40963e7b"},"mac":"8a145ef9a32fc197cd65701a6888f2c793e240da495f2a251e4e37c8b61df209"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/26.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([19158831748122645944593644394503545678618290934954617492699067769981756358210,12560741521317272139746886807177768918742277656703145905491815814034284961092])","crypto":{"cipher":"aes-128-ctr","ciphertext":"8c53fcf13ad0d68089027e52b1140c4fe80c4033b8ae1b81efef160670abe2a2","cipherparams":{"iv":"255ade353730bb457bc69c0b9de9ff67"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"badfca9870f3794ba15ad2c692db0b9dbf4ac156c398957909ab1731c9303523"},"mac":"397286905251c9fe2ad5b29d41b69064e1da3f25a7dcf6d4ef7b7da01b5ddd05"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/27.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([12136157236363643616142116383032860405815745886037271489416898913863972661989,4779075748177536006328755206808714968524308027798850811421334467066317716242])","crypto":{"cipher":"aes-128-ctr","ciphertext":"b9c33a59f7ce47eff6295574174d3ad798db82be6a0acd007f5376271d5e3f77","cipherparams":{"iv":"7dbadd8f3705d37a6db480bf60894ed3"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"6b34d0a44b7e2ebdf40385f0d3fd1d571adf50706e4fdab4e77238f1fc47e7a2"},"mac":"1c3fcee997e64965a36fa5fb19182ace68af0a9b6bc28fdc0465515012059eb9"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/28.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([18980855470778741648710005752467139596946957760626274292252653515019813706269,17540213314418470343529136421950389518297135810471497466972135437287199160701])","crypto":{"cipher":"aes-128-ctr","ciphertext":"edf353fccf65772395df040ed1be820c16a09d4534aac352a59845e7d0ff96ff","cipherparams":{"iv":"41cd295548fbb62b20bee78b552402ac"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5217d2fcff7d73997c0d306d13ca0b3104a2bf454de5e7df13219b18b158ec16"},"mac":"2f4ed657738db37db81f03e7167c8a6a653ea3264e6e1d82fa532ac29951220f"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/29.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([5911644245449547299959042957521482342513620478013021875557255460485422202816,18110982877430979422646478522923686996918866416323459490119359474448467138017])","crypto":{"cipher":"aes-128-ctr","ciphertext":"375ea29f42f01ab2cbb5bdca5b90492d2bd579bdc46669dc1f3877c3aea1cb26","cipherparams":{"iv":"ea29b6eb28197b9ea65dbdeec19e2cde"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"fdf68e1dfdbfaeabe3371aa19690802a9f6412d7da20c57e2cf8a4fb27302a2d"},"mac":"1ecfba7f53f246b8b17b67c9789de2f220cd592f425bafff8b768026ecec6570"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/3.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([3336192159512049190945679273141887248666932624338963482128432381981287252980,15195175002875833468883745675063986308012687914999552116603423331534089122704])","crypto":{"cipher":"aes-128-ctr","ciphertext":"c7fc50d7cd8e324f8e27d4f14991dc821b6552496c5c0330506d239bd11f5fca","cipherparams":{"iv":"e9a0897abbd105b322ecaecee5acb344"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"1bb93fdaef6fe17cb50d1d7963f27efa025e09390b4718e56f51479b85937d78"},"mac":"4c28491d98ee0181d99277f011c2a396dbd29d8b6461fb3d802a0ba4317955ba"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/30.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([2720044833204188395624694657686773550091618426264251159690669884716975954779,19604939037818477735018594599099942177900991174118281554694461044141050953005])","crypto":{"cipher":"aes-128-ctr","ciphertext":"a8b63b485a261c727bb0c02dcd54ec543fe13c92d825ba45d4f06f61c9f9ec65","cipherparams":{"iv":"5bdd7645eac1c78dff5162abebe061ce"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"d7c950442da39cb5eb3d18316eee07adf43b86aef0773f40ba6b9cfb776796b2"},"mac":"4c9b875046ceca809efda96370fb34dfab0f3f57804d4d10d9808afff84bbf02"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/31.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([18022940499431174446329667667911375299162137368251831572661025609212615967435,7261497491102091953736260388560598706619812982761347484816839293190798006190])","crypto":{"cipher":"aes-128-ctr","ciphertext":"e2c2efbb1e4db8c880fc4e85f858259e8b24ae4161c38dd26632baf608c27d35","cipherparams":{"iv":"c8a37180f3ee3c547a11c8216a69c767"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2cc181134ebe4340230ba84984b56530ed3294067714bd2b0b1a5d7f96da437c"},"mac":"a4ee1b3636837c4354640b99363e661ec9d89d9984961b301efd661103583eff"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/32.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([8060345189150686086757712455644277851592796326949026610511653927255572899664,15493352568303228031174308449620003073974090709310364781561275376160658199815])","crypto":{"cipher":"aes-128-ctr","ciphertext":"1c0c0a5d790a336c0ae8673afea54f7fb02647ac95d69dcd447b69f209c1d94d","cipherparams":{"iv":"11f81079a7fcd19494216dd685cee34d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"59b8276ffda34cae621ba55c88487e8056420fd0e898f1b89b2baeaf4e713f00"},"mac":"7c01e113f56ffdc8aed039580536b186960d034b4b0c78e2d4956cfaf318697d"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/4.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([5461183145235095536185921866819931413759917396672055080092869234016663469138,20442419532030122204650237288303516480860317711313899660505680678599256877121])","crypto":{"cipher":"aes-128-ctr","ciphertext":"b79e6d2c40b086f03e869709fb5c7d171fde848c0aa979e3aa88606143970c9c","cipherparams":{"iv":"603d9100d76a7aeae988b708f9c0f36a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"52f88a7f27b638341604c88a769d2c3f2b72817b41321625ac56e5cfc7c21ba8"},"mac":"cce3ec704533aa41cfe2a43899d91edc3c12f2d77010a4b03209c4788210a3aa"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/5.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([12634190904373954099752375119048571088990104805633586004685592779380787618974,10807246208937483335882723488636120559144850639059326860720519447026541499868])","crypto":{"cipher":"aes-128-ctr","ciphertext":"46d94a18493f8caee43c1506edcf819a44d9ff0e7dfe61d570a1f1d91961d46c","cipherparams":{"iv":"4d514574517a07bbee24c4e853248333"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"85cce755c421ca53c10ad464a10039b388f45f51498dc05aa3f319045c9ee21c"},"mac":"6a17e859c67ef884fea9a2926a5d5327e8f7005b7996a5225c91677bcf0c0285"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/6.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([998825606277355757420316283675673966461252242163581460241088847131404357665,14143186989268053039151094265450088754922200128802663655609357967257532908268])","crypto":{"cipher":"aes-128-ctr","ciphertext":"6a5db6036795127ea2a641ea90d18e80d26dd63d276b8618633980aba2546fcb","cipherparams":{"iv":"235de1df43f4d852d86acbb4705d5e1a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"99af46b2bc7e49acb6d13662468ea0cf1193a75df07799a4e56b51af1980652c"},"mac":"beec633e6a8dc9086f80dc1ab6c510199d9ac9bafbdd6e5d7f20a2012ff5c379"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/7.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([10121256457265938196706067601404064832627252560034336421499695400642545254801,11674275106027330324731802358520890306350968322254870970449761074002347263215])","crypto":{"cipher":"aes-128-ctr","ciphertext":"184d2358c38d97cb2d061f56f2cd84d7160c8846ae9711ebea2f9ce2e232f20f","cipherparams":{"iv":"525f365bc630356fe31c919b799c368f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"951f54be5c52a9c75d7d498bad5eef96a911e89faa1743e6a1ec5784ae46bb87"},"mac":"9ce78192fac9f85541561d338d62aaefc7046306c721fba3c843edeb2c9af06b"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/8.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([14426781743224558418735683552171722414505149113035076242158568262547142570240,21016114064160213955277812867535917602079212232975414551749771881432738089623])","crypto":{"cipher":"aes-128-ctr","ciphertext":"762ebff4726599abe39cf96fa7bd3339d5ad8ac23f7192d1eaa702b9a4a08181","cipherparams":{"iv":"c226ebc79d8f643d5274af1d9b3d6d4f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2e881774c0f6130f5eb799fe59734c0a705b8f814561e0e998a9ec6f673aab10"},"mac":"0059b637d8ecef60b101cd7676c725084e1beefcf83b9fc523d39737cf518f9a"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/keys/9.bls.key.json:
--------------------------------------------------------------------------------
1 | {"pubKey":"E([15024754042811110095159400258551582491803596155580374188962567421363036126618,12539083378736512837240993976596344871120568508209823835620515871494903252733])","crypto":{"cipher":"aes-128-ctr","ciphertext":"370de40015c0833e75bb9a34b23b66ccd1bb91eb3e120590780ab5980623ef29","cipherparams":{"iv":"de728af3349faf4205c06f402201dad2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"72a1e5209ccc0007c2c36b37197870b9420d6280155e68f605829ab390dca456"},"mac":"51fb19e1cbac91e456c1cb04be807192ed6d5f562caba98d62131ed94daead05"}}
--------------------------------------------------------------------------------
/inabox/secrets/bls_keys/password.txt:
--------------------------------------------------------------------------------
1 | fDUMDLmBROwlzzPXyIcy
2 | 2EVEUyHCrHZdfdo8lp29
3 | k1ZxvbBylq0lscHnrrJy
4 | gf3ypq0bqyI62VyAQU4G
5 | Y76UPXxemfxjNPyEFrFS
6 | NseVMocfivFVP887Wqy0
7 | aUhenVkkwPZhX7WPVYrl
8 | 5p5ZHom4QfpCRLy8p0yf
9 | rBolCI7PcAeZjGIXvdBJ
10 | LOlpjZ21cvsH4fr25SWM
11 | pdLIK4CE3HUK4h0I8ppw
12 | wjCGHTWSQmFNvXC9p5uS
13 | 9RaW4fbzNqW2HUIuAHXg
14 | Li85M8y9lMx8p5wpnT5d
15 | FvgdTzbLfw9UpEskGSCY
16 | WbTNo4QDNyl42vGe0U6i
17 | QL3MY48hv4lFpvHlcXJ3
18 | jUuT6HSJI8g7BGPSYLIP
19 | hBdbpU13NpQitWT1IVFN
20 | qlaraP4l2Q1Hy53t9UxZ
21 | ikZZHQiIofHMfazoCO3b
22 | hjc3PMR6crv19WJpaK57
23 | aGbugQk1TY0Nza3Jmauh
24 | lG2EBdFfy7uF6wvyzNiu
25 | aC3fLJWEtZrb42vcVsiu
26 | rF6YJd3ao839dpoB3tIc
27 | Mt078Gxmuey71WrNIHN2
28 | 4qLJQXwDzONo1BqZyhYf
29 | 4gZkXVPO9EhnrMrsKCOA
30 | WD7sPzlZT9eWkvkFUMBh
31 | kwsX9141JLqzgwOO7cmq
32 | LQtA5PcUBPr7Tom8U0Zo
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/1.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"d5a0359da7b310917d7760385516b2426e86ab7f","crypto":{"cipher":"aes-128-ctr","ciphertext":"91a55f690a65c9b352a24783d1db851a7b2f826763ff979a877bb78ae63860eb","cipherparams":{"iv":"313c5db87ccef736f2844c218b0728c2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"64e28acc8270b64aa22fb6554a694657face2887ceb6cc209c607db11c4338d7"},"mac":"9087dd2b17322a7237505b368eac0462dd8c87637516cd80740fafe7d2f3ae5b"},"id":"96c2a806-cd73-4e95-8d65-e0933a3e7e1c","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/10.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"0b3cf18fa9043390da5c47cf814e0d7cfc468587","crypto":{"cipher":"aes-128-ctr","ciphertext":"7ffe84722472a26a794f883d089f5d4bdcfaf737f85928739f2350a3510b08db","cipherparams":{"iv":"40644a2d5835fe1a6ba71525534079a7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"26628be475a91c93fc530e59a05b8fe3b5e07f53a7ed3ac1216df78808a72070"},"mac":"faa8736c9650e74528ec35bb1cf888c3c2b20bb50895b55da117e7e42dbb59a7"},"id":"95b573bb-16ee-4872-a043-cd56828a5ded","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/11.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"59100e7fc2facd855194096086c4bf0ffb3d50e8","crypto":{"cipher":"aes-128-ctr","ciphertext":"ab407cb1e8555776b01b615f366a80ae9108078d4fad8caea5ce6a481944e269","cipherparams":{"iv":"d2c199c312b3cb140c7533c0a95c61f7"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"b73e5791defd7dbd2931d085b2afaeeb3e93e7323bc306fc4df8d8085941b370"},"mac":"f39dedacf980c4fbd7ab5956278ad85e16a5083961f339f3d8568dbd8e3985aa"},"id":"c68b594a-b999-465a-8680-54610bc9fbdd","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/12.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"642d1008e558cc11e33ec94f13f12d893682b338","crypto":{"cipher":"aes-128-ctr","ciphertext":"69d6f09dfa40c0f60892a743db9d3e8609eb84c9d5faca1e94bcc487cd8d2946","cipherparams":{"iv":"bcee7119fec80e94b7fcbcfea0b4d41a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c5bf0fcd5d8a1cde76c539ca5f0c4d2a8fc997b22b81eccbe4ee07fb73fa615e"},"mac":"5bb3e4e511d55bf5d8b8e9b393e8a88596994adaef3bd74c8a1851af489262b4"},"id":"70a11e80-847d-4076-9438-8a9200f6cc29","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/13.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"3dbbe0ea7814e42269d049e7e41fba069e1bf336","crypto":{"cipher":"aes-128-ctr","ciphertext":"66e0dc0fa30888ff51e8ad01ef5c1c6a7b84aac7d494db563bf251e5e2c85007","cipherparams":{"iv":"fe7269b215c984d2d31cf0d2c5336e6b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c999910020707a10242049558cd046b55f23b16099673eb53743bbc7cfe2e81b"},"mac":"e2f05655790395a679013041b6f0302866449161a0e34072e9181df33cfefb87"},"id":"2eb4c107-8408-452f-a5db-b9a3c8907f64","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/14.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"5ed64a0bafa9d11c4284abf24cb3d441fc1d7398","crypto":{"cipher":"aes-128-ctr","ciphertext":"2fa2c023f707639d249c42ab25f85b71c8ce75e8e0cd2a592150f4a2f3419065","cipherparams":{"iv":"8747d27a09a8028a48320bbc84b84756"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"14b15c78ff7286765e9bd2c7bc1e79e10d705d114c5affc9ecf90ef7f7a814b5"},"mac":"4a1f8dc8c6373394298a499f92f520b4400312e7737160534952844e220c1ccb"},"id":"1c8d5d68-91dc-4b45-8b32-f597cadf041b","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/15.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"ec8cec1d7dc14aa0bd2d93f328e672f50e72e234","crypto":{"cipher":"aes-128-ctr","ciphertext":"87ec639d189ca110ad05c92ed5ae4b78d8c2df51c7a16e5d20b03ac906878019","cipherparams":{"iv":"c774a26cb597ce4d7511e3ae16979f56"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"bc2203a28931c6e5d41aa0b3e97df1d29a1136f1aa54423afcfbbc49c209aa89"},"mac":"1e460861664b5bb8f040f7ba6eff98bfae743203a38041676ff44c1ab9ff95b1"},"id":"8e754f2b-dde9-46d5-9470-cb3cb639e541","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/16.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"0e25cbd0de92f5686c815a360d0d223e4e376f8d","crypto":{"cipher":"aes-128-ctr","ciphertext":"6173f9067d8b4077cfaf3b233d7671b254ee24a0b720e84a0a687bbf93c7e852","cipherparams":{"iv":"ce0287cc5eda247292b4c4a29370d563"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"29f6d63e5fc598700888de697b12c6fb0c4bf2093f339df88bde56db7a52abfe"},"mac":"18713f079cb422eb9a2be4e8e8eecf3f12a1ffa967b539866caa8932e4ecbe20"},"id":"e8f45765-9982-4583-9e9a-bdf68311a8c5","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/17.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"d11214af99a3eb6163d4bf0a379af52e63308560","crypto":{"cipher":"aes-128-ctr","ciphertext":"7d31e416abeded6c30363d03e6b7bf420db9481b057824b6e7109e0653fb01e7","cipherparams":{"iv":"774784b58f450834836411d2f61310c2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2aac5975ed2cccc2b9912f7372a67d1824fe5411d1642c848c8e22b50b327d50"},"mac":"0c329739a306493d6c09c502e0708beca0df979afe1ab2fc3c43c8a681316ca0"},"id":"6cb0bc83-d1b7-41df-8557-effada7899f6","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/18.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"8ebd37ac6af1b7e414e26b30a3b7ece43aaf8941","crypto":{"cipher":"aes-128-ctr","ciphertext":"5e90d08a131bd6a0d5dde116c9aa1b083052eaa3d3b5adb8b031516f931c328b","cipherparams":{"iv":"3bc28bb9df18c70acedfdb7ced98c218"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"f46e3e829d8901eb2b89f1a9e7cba49963c70e9110f854893b8fa486f4eb0b8b"},"mac":"3855bb83623661a04b9bdf47ab4f9a4961ac59c72e02cdc0c3fe8b6dbfcdaf85"},"id":"c0d0575c-df49-4077-8c40-86a578edf838","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/19.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"c9bf2eda569bd5e809b1fa18c7101175d16e08e1","crypto":{"cipher":"aes-128-ctr","ciphertext":"2c48bd19474681953d1f4561d987aaad15bf4f6552a717fe3fe4d2fcb17ada4b","cipherparams":{"iv":"9dc2e48f2ca9157f24f7ec9fcdc46876"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"25ff2e5450c5993fe27c752e0ff4e45a71a8fe2e8dd46326b6e8f37bbda85b9b"},"mac":"607e62c4eb3079f5aac590b83e5d22157581883ff94cae08057e8c5017c9ee49"},"id":"a3de72fe-3935-4d64-9ef0-f1dc179871f2","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/2.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"9441540e8183d416f2dc1901ab2034600f17b65a","crypto":{"cipher":"aes-128-ctr","ciphertext":"f5eb7776cb577b05ac7762177e447f15c1adcfab57a39f757f3e4b92af6f661b","cipherparams":{"iv":"2b41e5cbb0bc3ca4c380071831f00ae4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e984d8a762013fd76e5a7c6df30de81a613899962a4c154f370259274b7e6b83"},"mac":"54b650442a628bdce4585d499f5bdf4e35c7cee81b90cdcbd89db4646f595aa2"},"id":"e8555893-d21a-48d7-98a6-06b7f07eba39","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/20.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"cbd9c4b0eafbf0f34443bf27c69fd5e68f773834","crypto":{"cipher":"aes-128-ctr","ciphertext":"1c8a5aa6c532adb3afc8bbc0644f52bb28f4c11a99c8067ba0e7eff2b3ec28c3","cipherparams":{"iv":"a3686a3ef4550acbc6e582a00627599f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"95cf8f6813618919ee93ed44e010888058a89733fb305db7bf0fcba591cc85be"},"mac":"ba8d2fb19084f27bd10e946120ef630cd6a2cadb8837f0315aaf87bed6e9e6b0"},"id":"439fe081-8737-434e-a9c1-2155923666d5","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/21.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"00895d817ac4d7a9c45fceadc9b7c6e113b2b461","crypto":{"cipher":"aes-128-ctr","ciphertext":"28f4ac8f746e037fd95ab732e7703bef21f013cafa78f1b44f8b3cf60b292bde","cipherparams":{"iv":"0f96d3cd4f09a67d8a6f3cba7e2f14aa"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"88e56f59b89a4628ca90c12163a916880821f57a34c7922b3c900accaf292722"},"mac":"eb645d1304e0d10d155f320e1f2e8b3a3fe9b58bd84f812b31d6e16e37968e12"},"id":"843070b4-9c96-4dda-95d6-70dbc0f8aa15","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/22.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"7955072ec31a2ef8157e85428b5592986fdce55a","crypto":{"cipher":"aes-128-ctr","ciphertext":"2e881bd3feed3eb7fad3801b89cd64b2e0f76e93339355bb0ff6cc8154a76a17","cipherparams":{"iv":"0c0b3b59377b2bb3db9811c94045d90d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"73ea3b06e6c2d941566a09196caa17382975cdb9c8761eaa1ccc35a053414419"},"mac":"c32881fcfca0357e2b7913c3cd5256bb858fa73e8bb28b92a464137005ddffd6"},"id":"526e2557-7557-475a-9fde-b07cd63ec5a0","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/23.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"4452be9e000e4fcd0a24eed063f9f0b6da5d27a8","crypto":{"cipher":"aes-128-ctr","ciphertext":"23945a98b0639971143af18cf55a3019c4d1916c57643f84afc2d8ed3866d585","cipherparams":{"iv":"258dec0769d9a8853698e8dfd59faa30"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"db3c9cc7800afce6d865ce1a26bf243942f1f4ae0d87ec5b94635ec9044e41f5"},"mac":"033ce65e62cc5f074ca9673234b38ceb5ffde4fd5bcad8f5d9a18070d4c0ba98"},"id":"3b8aca37-ac9f-4360-a523-f5d195d5d283","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/24.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"d1a22e0c13bdc584c5e5bd18a064c3dd89a4b28b","crypto":{"cipher":"aes-128-ctr","ciphertext":"19a2b7d8700436c319e436d0b6782b56bb27378a828e72c3c457babe8f8ac991","cipherparams":{"iv":"d3ede0a4d3a66dbe367a2d3325071abe"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"da95a06735056b9c8474dd8f77929d6f208fec44d123d7ec24cfb0b17c375be1"},"mac":"ab93c6aa8ad28d771a37eb1462a29616fd9ce38f5c30af111d406a0388670098"},"id":"41569731-e3ab-4d27-a3f7-58246ddea0ef","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/25.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"352cf6e408aced515a958c7e9829fefed8892a15","crypto":{"cipher":"aes-128-ctr","ciphertext":"109fdcd8054f21cdb03e33f19653f26e461fd19328e01f3a81af23f85549ed09","cipherparams":{"iv":"3b44a3854d75f393a810e8b8c268a7a9"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7ee0329b68c18d8198bfae3f5e39dccf6e2713b7d1abc17a8a5d4beea5d3a5b0"},"mac":"a8f4a08659100ba516a272141f6c3fa037abb3406c8cdbf7abf43955d3d9d1da"},"id":"ae3988d0-ee5a-49e1-b65a-f9dd53c009a7","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/26.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"666ce65fd2fedd3fae22a1523b659b90afaebe4a","crypto":{"cipher":"aes-128-ctr","ciphertext":"7a90a996bd650f501a8efbb1165f3f332171dd85c29fbba93d2f339728cbca2a","cipherparams":{"iv":"3f2c2adcc43a7c5fd597dc155a8d264a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"52847fa5b580e0d71e99c28ae409860a1ce7d68f4a91fc085b6362a0c335bc7c"},"mac":"3639637a15eab2722710a21cf59fcc9239e53ec1505c625c6ee9edafe534756d"},"id":"405acb37-2593-49cc-9dda-61cc79e6aff6","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/27.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"eb73044f28ee22e9b27d7b4ed596e7d6a1ba6b8d","crypto":{"cipher":"aes-128-ctr","ciphertext":"cbd65cbe1077675195bc072cb52ee09ec04da7ee441b45cd0db7ed2c84f7e42e","cipherparams":{"iv":"9bd060575ba9e7fcd25e5b6318c4ade9"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"b35f14064ea87d78a049baef4165548ed239f4eb712627875551d67f612783af"},"mac":"21387a7b018d78cb8462c210c0c724e04a17fb4248385041b2f44be2ded5af9e"},"id":"041f04c0-bb85-4b25-802c-6aee643996e1","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/28.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"a9b859bc8e665228602a35e26d6a59a4b8928b22","crypto":{"cipher":"aes-128-ctr","ciphertext":"80ee116be249473d8f4b7aadd22e4d4dff402157c3b8451f7eae7229dfdff1d0","cipherparams":{"iv":"9c1cef56fd49953d91cb466df95531f4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"aec293f9ef3c1bbb9423ec3c37a4bad519b194b4a2ac153846cdc46fa2a80b46"},"mac":"3e0b79e67ec62fde9848641f83f567012969fecb25ad874ef0721b1cefd8da8b"},"id":"9f10d9b0-18ee-459e-8e76-db89777a564e","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/29.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"ccf0d0066eb3eed53196774b5eac08a38c0c6e0e","crypto":{"cipher":"aes-128-ctr","ciphertext":"880e74371093d27eafbac57f737d24ef017d5ae4095390e6949d283190956735","cipherparams":{"iv":"0cc4e20e186ec48007b909155a1d35d8"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"865afcc45b0b72af6f436c1d26dd55a2b120495d8558404186f4436ea26a839e"},"mac":"960f218168b69ac164fd2afc4b86df6fc57accc6b02e133ede26bab8b15d7083"},"id":"26fe64b3-8182-43dc-bae7-b89c48c4cf08","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/3.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"f270e0dd5a1cc34cda8fb991307604097e622002","crypto":{"cipher":"aes-128-ctr","ciphertext":"d382b45ad3a9b69fd5933a38d711996b5283bb0e6a71e6da09edeb6c4a23b069","cipherparams":{"iv":"cf764c9c72afcf5748131711f61c49d0"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"bbdbccf9058c71c63cd251a9d975454ecdbd5f7795329954867a607512492b0d"},"mac":"3c16f6528a7812c2da48ff2d251e4c830875f5fcff6694a81b908cabdb809a7c"},"id":"05b7b538-57c6-489c-bf34-fe25409e7bf4","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/30.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"c45ea551caf9c7f203ecf44f6e6049dfe625ce67","crypto":{"cipher":"aes-128-ctr","ciphertext":"d1349feffa1a63fb99e2f6e00128ff033664f059a8d3a45efd425796e2e7bede","cipherparams":{"iv":"bcb00c71a916171f0ff7a71b8aa570d2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"0ee32c44235bf53b65550767a85519123ead6e1017f25f71b98702ce1536bb01"},"mac":"e0541f7772b952b314ce4e4087262e965a4d99ac74940da231054b7c572bab8b"},"id":"6e8c192d-3548-4a55-b5b1-2690ac5b7a64","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/31.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"2a49d0005a6bd2fe60c129d23b75727f1a038ead","crypto":{"cipher":"aes-128-ctr","ciphertext":"610db04fc54e78307fbed32dfb7be134234f0ab749257922939cc0da0fecf76d","cipherparams":{"iv":"7fc6ab696fe10ce0f6dc26a91555560d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"bf21a5cd96d6f5c9aa46b2a9ee182d70de8ab6da903c94bf9944c67e7eb6280d"},"mac":"6243abb184de084c33cd9ba88e72dbea8ee7f1776dc2fb485259f10ff2a9ed84"},"id":"5542e626-5695-495e-b499-86ad99e6afeb","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/32.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"7548db693b038db64b1e945ae2bc011f03d6edf1","crypto":{"cipher":"aes-128-ctr","ciphertext":"5cd910b740c8e30fbdc6c4dfe5fb5e9f0be22ea0aefcb905e114845bea3d2813","cipherparams":{"iv":"0e446ecc5cd4ccc0ec4eff086737db4e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3233d60bec2eaeb7d717aab7b9194289e6811c633477b266b6d59c60d796fc99"},"mac":"280e4181516b9d776938c63e5d2e6bace059ddf4be3d680e177dcc1894dab76b"},"id":"e29eb110-3579-4090-ae50-e203544b9d0a","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/4.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"cab1b44dd1f1c265405878ac1179cd94d0dba634","crypto":{"cipher":"aes-128-ctr","ciphertext":"90677adad6b5bfd8308956b5a9af9215dfe4a4c9844472f152db936a5218bf8a","cipherparams":{"iv":"e4d7768d9eaeaced4789617f0d187fec"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"f4a39322818f67d9ff783947956b9e81543a05ad437a467fa1606eb58e7c98cd"},"mac":"52c630d93bc550b4fc8902803d34b851df8be13e77ea74d796a5c0cd3a67f5f0"},"id":"0ebaea50-86d4-4973-aabf-949e88bb4c45","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/5.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"cebe05cd708f000177b12e8270dfc310d834f4cb","crypto":{"cipher":"aes-128-ctr","ciphertext":"1c74aca2a87723d366f93abbfb29c1eca0a49a8f9042a028d5178cc7880ab8ae","cipherparams":{"iv":"16d52a0111e02d000566314235884f5b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"40886cf6d8526ea5e678993cca65f877477fd0d65fee7e8d0dfa73a2c7662311"},"mac":"20aa05c60bfbc79279419b5e1f8de70c3304822026196c32526cfef9817fa9d6"},"id":"943f80c6-9dd8-496a-a5c4-fc5d41ee06b9","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/6.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"ad5824ed245e92ec3ec65ffd828f5de74529fba8","crypto":{"cipher":"aes-128-ctr","ciphertext":"3fa43553999d728dc36dba19ed6f072128140872bbad630ff89beb6cae00a2ac","cipherparams":{"iv":"5b23ef9a4bc487f64340a17bac19d7ca"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2e6491baf78fd9cda53e907b136d49860a3f948e8df88d4cef1bc0cac5aafe1b"},"mac":"2c65bb27ef294a5db4e12886802791cbc1630e1273022775d1111c06ffc1a81c"},"id":"0f72f179-2a4b-4cf9-89a0-a055e07d48a4","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/7.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"8ac5c23217164edcbb4ffc54a784961b7349d8db","crypto":{"cipher":"aes-128-ctr","ciphertext":"b0a1ac28c336f2865f6f8be58582db78a5f6915d01530f78aa9cfd2dc121d44d","cipherparams":{"iv":"2d148abd57b3ed1ec71b9c17c7360040"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"86452cea6ceba3018ec0d0cf780c05e0b4b814cf468b182f718465a7a2e82da5"},"mac":"89d7e37cc7bfdd5bc70cf85efbb4fc2903e0190967b9b750bb484ed28bd13b53"},"id":"e1f714fd-9158-44cd-bdb3-83e4ca4bff98","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/8.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"b298731f7a058aa7f27edd28d5085f8096016077","crypto":{"cipher":"aes-128-ctr","ciphertext":"64981c9972ad936da07f9e859a136f9b1c5e249ba2e88544ad9bf959fb8f9527","cipherparams":{"iv":"f27eed3ef2c1d687965ee4a887b944ca"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2e389c33c50a0d62e2083126e3b3fbe9472c516baa30f7ab2c170fc35e7b93cf"},"mac":"f98c4c7d7a4f5d233ede509bb3afe964d63b87ab2f5ab348decf57bec56f9b8d"},"id":"6902db2c-90f0-4bb1-886f-c71fc7210e37","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/keys/9.ecdsa.key.json:
--------------------------------------------------------------------------------
1 | {"address":"1ed94239dd059dbe628743dd541686095c37e7d4","crypto":{"cipher":"aes-128-ctr","ciphertext":"004dce42690816cf5ecc1b7e7b6fa4a46806d918c48e5690be2db7fefa7895dc","cipherparams":{"iv":"934d2da5ad004bf0fbdfdb32fa4c4e2e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"fa1fd7aaa8605012178434dffdb51f2edd7490e49036d92d902a22a819ed482d"},"mac":"20f2b6ca2c167e1fbebbbe909f800e4e7a3e47a293216249e421f0a66dd838be"},"id":"bac99176-38e1-4774-9d8f-ac2971442307","version":3}
--------------------------------------------------------------------------------
/inabox/secrets/ecdsa_keys/password.txt:
--------------------------------------------------------------------------------
1 | EnJuncq01CiVk9UbuBYl
2 | isru1gvtykIavuk1Fg1Q
3 | 3bxTdXda0Kwvo8KC9GGT
4 | pdDHi8PvCZuH2NJSiXKw
5 | hiS6AIWRbXYLyJP7TNPn
6 | tqNhwY4gi9HLMAkMVe93
7 | mAdR3cbfAcMu9nhzuV6i
8 | xaP3cOWum2dWYfzmMVXt
9 | k8fPmH9iwahgmstfUaCH
10 | yFicmvGUUrjQiNdDnNkz
11 | stbGXMQzT3fSm0LPhNox
12 | ezgAw90wUeyjsQeY2jsa
13 | Vw38M8yiqZxUokTzU1Ob
14 | oHbsTP9Fkqu09oyWYhOM
15 | Ie7hUi42fNSTrXiXifcO
16 | ssRPp0RHbJlVEqa2eIJb
17 | 1WB8ZRC6WiwVEwS7qJkl
18 | LDUgvPjz25rXPcocM103
19 | 5zGZfbT3PYR6afkpecnl
20 | xMgH2uC67aazoly2RrN9
21 | syxghmpnjEQ5Z0a3s2qG
22 | AXxCFZ031Noesz0dUuIp
23 | BP9nFRp4j70tnJcVzt4O
24 | iJhtsSAswlaVMhrBglzT
25 | xmm0XMIuYKPYV6cBt2nG
26 | T7XrcsKkligq1hTzEZIN
27 | nTzhHKFaTtF2xU9W3Mi3
28 | yw1dkYY1tnLLSmB3rZMt
29 | iGWvjh9qvmJ6e1kTOxO9
30 | XfeDX2mVm8YAef0GHBPu
31 | G8Gtz530EOd5X6phMhZV
32 | hb7uCYAO6HI3r5ZsGRtx
--------------------------------------------------------------------------------
/inabox/secrets/keys_for_200_operators.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/inabox/secrets/keys_for_200_operators.zip
--------------------------------------------------------------------------------
/indexer/accumulator.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | type AccumulatorObject interface {
4 | }
5 |
6 | type Accumulator interface {
7 | InitializeObject(header Header) (AccumulatorObject, error)
8 |
9 | UpdateObject(object AccumulatorObject, header *Header, event Event) (AccumulatorObject, error)
10 |
11 | // SerializeObject takes the accumulator object, and serializes it using the rules for the specified fork.
12 | SerializeObject(object AccumulatorObject, fork UpgradeFork) ([]byte, error)
13 |
14 | // DeserializeObject deserializes an accumulator object using the rules for the specified fork.
15 | DeserializeObject(data []byte, fork UpgradeFork) (AccumulatorObject, error)
16 | }
17 |
--------------------------------------------------------------------------------
/indexer/cli.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | import (
4 | "time"
5 |
6 | "github.com/Layr-Labs/eigenda/common"
7 | "github.com/urfave/cli"
8 | )
9 |
10 | const (
11 | PullIntervalFlagName = "indexer-pull-interval"
12 | )
13 |
14 | func CLIFlags(envPrefix string) []cli.Flag {
15 | return []cli.Flag{
16 | cli.DurationFlag{
17 | Name: PullIntervalFlagName,
18 | Usage: "Interval at which to pull and index new blocks and events from chain",
19 | Required: false,
20 | EnvVar: common.PrefixEnvVar(envPrefix, "INDEXER_PULL_INTERVAL"),
21 | Value: 1 * time.Second,
22 | },
23 | }
24 | }
25 |
26 | func ReadIndexerConfig(ctx *cli.Context) Config {
27 | return Config{
28 | PullInterval: ctx.GlobalDuration(PullIntervalFlagName),
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/indexer/config.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | import "time"
4 |
5 | type Config struct {
6 | PullInterval time.Duration
7 | }
8 |
--------------------------------------------------------------------------------
/indexer/header_service.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | // HeaderService
4 | type HeaderService interface {
5 |
6 | // GetHeaders returns a list of new headers since the indicated header. PullNewHeaders automatically handles batching and waiting for a specified period if it is already at head. PullNewHeaders sets the finalization status of the headers according to a finalization rule.
7 | PullNewHeaders(lastHeader *Header) (Headers, bool, error)
8 |
9 | // PullLatestHeader gets the latest header from the chain client
10 | PullLatestHeader(finalized bool) (*Header, error)
11 | }
12 |
--------------------------------------------------------------------------------
/indexer/inmem/encoding.go:
--------------------------------------------------------------------------------
1 | package inmem
2 |
3 | import (
4 | "bytes"
5 | "encoding/gob"
6 | )
7 |
8 | func encode(v any) ([]byte, error) {
9 | buf := new(bytes.Buffer)
10 | enc := gob.NewEncoder(buf)
11 | if err := enc.Encode(v); err != nil {
12 | return nil, err
13 | }
14 | return buf.Bytes(), nil
15 | }
16 |
17 | func decode(data []byte, v any) error {
18 | dec := gob.NewDecoder(bytes.NewReader(data))
19 | return dec.Decode(v)
20 | }
21 |
--------------------------------------------------------------------------------
/indexer/leveldb/encoding.go:
--------------------------------------------------------------------------------
1 | package leveldb
2 |
3 | import (
4 | "bytes"
5 | "encoding/gob"
6 | )
7 |
8 | func encode(v any) ([]byte, error) {
9 | buf := new(bytes.Buffer)
10 | enc := gob.NewEncoder(buf)
11 | if err := enc.Encode(v); err != nil {
12 | return nil, err
13 | }
14 | return buf.Bytes(), nil
15 | }
16 |
17 | func decode(data []byte, v any) error {
18 | dec := gob.NewDecoder(bytes.NewReader(data))
19 | return dec.Decode(v)
20 | }
21 |
--------------------------------------------------------------------------------
/indexer/test/mock/chain.json:
--------------------------------------------------------------------------------
1 |
2 | {
3 | "chain":[
4 | {
5 | "id":0,
6 | "fork":null
7 | },
8 | {
9 | "id":1,
10 | "fork":null
11 | },
12 | {
13 | "id":2,
14 | "fork":0
15 | },
16 | {
17 | "id":3,
18 | "fork":null
19 | }
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------
/indexer/test/mock/contract_simulator_test.go:
--------------------------------------------------------------------------------
1 | package mock
2 |
3 | import (
4 | "context"
5 | "testing"
6 | "time"
7 |
8 | "github.com/stretchr/testify/assert"
9 | )
10 |
11 | func TestContractSimulator(t *testing.T) {
12 | t.Skip("Skipping this test after the simulated backend upgrade broke this test. Enable it after fixing the issue.")
13 | sc := MustNewContractSimulator()
14 | ctx, cancel := context.WithCancel(context.Background())
15 | sc.Start(time.Millisecond, cancel)
16 |
17 | <-ctx.Done()
18 |
19 | events, err := sc.DepositEvents()
20 | assert.Nil(t, err)
21 | assert.Equal(t, 3, len(events))
22 | assert.Equal(t, events[0].Wad.Int64(), int64(1))
23 | assert.Equal(t, events[1].Wad.Int64(), int64(3))
24 | assert.Equal(t, events[2].Wad.Int64(), int64(4))
25 | }
26 |
--------------------------------------------------------------------------------
/indexer/test/upgrader.go:
--------------------------------------------------------------------------------
1 | package weth_test
2 |
3 | import "github.com/Layr-Labs/eigenda/indexer"
4 |
5 | type Upgrader struct {
6 | }
7 |
8 | // DetectUpgrade takes in a list of headers and sets the CurrentFork and IsUpgrade fields
9 | func (u *Upgrader) DetectUpgrade(headers indexer.Headers) indexer.Headers {
10 | for i := 0; i < len(headers); i++ {
11 | headers[i].CurrentFork = "genesis"
12 | }
13 | return headers
14 | }
15 |
16 | func (u *Upgrader) GetLatestUpgrade(header *indexer.Header) uint64 {
17 | return header.Number
18 | }
19 |
--------------------------------------------------------------------------------
/indexer/upgrader/upgrader.go:
--------------------------------------------------------------------------------
1 | package eigendaUpgrader
2 |
3 | import "github.com/Layr-Labs/eigenda/indexer"
4 |
5 | type Upgrader struct {
6 | }
7 |
8 | // DetectUpgrade takes in a list of headers and sets the CurrentFork and IsUpgrade fields
9 | func (u *Upgrader) DetectUpgrade(headers []indexer.Header) []indexer.Header {
10 | return nil
11 | }
12 |
13 | func (u *Upgrader) GetLatestUpgrade(header indexer.Header) uint64 {
14 | return 0
15 | }
16 |
--------------------------------------------------------------------------------
/indexer/upgrades.go:
--------------------------------------------------------------------------------
1 | package indexer
2 |
3 | type UpgradeFork string
4 |
5 | // UpgradeForkWatcher is a component that is used to scan a list of headers for an upgrade. Future upgrades may be based on a condition; past upgrades should have a block number configuration provided.
6 | type UpgradeForkWatcher interface {
7 |
8 | // DetectUpgrade takes in a list of headers and sets the CurrentFork and IsUpgrade fields
9 | DetectUpgrade(headers Headers) Headers
10 |
11 | GetLatestUpgrade(header *Header) uint64
12 | }
13 |
--------------------------------------------------------------------------------
/litt/disktable/disk_table_flush_loop.go:
--------------------------------------------------------------------------------
1 | package disktable
2 |
--------------------------------------------------------------------------------
/litt/disktable/keymap/keymap_type.go:
--------------------------------------------------------------------------------
1 | package keymap
2 |
3 | // KeymapType represents the type of a keymap.
4 | type KeymapType string
5 |
6 | // LevelDBKeymapType is the type of a LevelDBKeymap.
7 | const LevelDBKeymapType = "LevelDBKeymap"
8 |
9 | // UnsafeLevelDBKeymapType is similar to LevelDBKeymapType, but it is not safe to use in production.
10 | // It runs a lot faster, but with weaker crash recovery guarantees.
11 | const UnsafeLevelDBKeymapType = "UnsafeLevelDBKeymap"
12 |
13 | // MemKeymapType is the type of a MemKeymap.
14 | const MemKeymapType = "MemKeymap"
15 |
--------------------------------------------------------------------------------
/litt/disktable/segment/address_test.go:
--------------------------------------------------------------------------------
1 | package segment
2 |
3 | import (
4 | "testing"
5 |
6 | "github.com/Layr-Labs/eigenda/common/testutils/random"
7 | "github.com/Layr-Labs/eigenda/litt/types"
8 | "github.com/stretchr/testify/require"
9 | )
10 |
11 | func TestAddress(t *testing.T) {
12 | t.Parallel()
13 | rand := random.NewTestRandom()
14 |
15 | index := rand.Uint32()
16 | offset := rand.Uint32()
17 | address := types.NewAddress(index, offset)
18 |
19 | require.Equal(t, index, address.Index())
20 | require.Equal(t, offset, address.Offset())
21 | }
22 |
--------------------------------------------------------------------------------
/litt/resources/flush-visual.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/flush-visual.png
--------------------------------------------------------------------------------
/litt/resources/iDidIt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iDidIt.png
--------------------------------------------------------------------------------
/litt/resources/iteration1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration1.png
--------------------------------------------------------------------------------
/litt/resources/iteration2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration2.png
--------------------------------------------------------------------------------
/litt/resources/iteration3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration3.png
--------------------------------------------------------------------------------
/litt/resources/iteration4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration4.png
--------------------------------------------------------------------------------
/litt/resources/iteration5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration5.png
--------------------------------------------------------------------------------
/litt/resources/iteration6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration6.png
--------------------------------------------------------------------------------
/litt/resources/iteration7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration7.png
--------------------------------------------------------------------------------
/litt/resources/iteration8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration8.png
--------------------------------------------------------------------------------
/litt/resources/iteration9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/iteration9.png
--------------------------------------------------------------------------------
/litt/resources/littdb-big-picture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/littdb-big-picture.png
--------------------------------------------------------------------------------
/litt/resources/littdb-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/resources/littdb-logo.png
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/data/000001.log:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/test/testdata/v0/test/keymap/data/000001.log
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/data/CURRENT:
--------------------------------------------------------------------------------
1 | MANIFEST-000000
2 |
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/data/LOCK:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/test/testdata/v0/test/keymap/data/LOCK
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/data/LOG:
--------------------------------------------------------------------------------
1 | =============== May 7, 2025 (CDT) ===============
2 | 09:33:37.810933 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
3 | 09:33:37.824567 db@open opening
4 | 09:33:37.825148 version@stat F·[] S·0B[] Sc·[]
5 | 09:33:37.828724 db@janitor F·2 G·0
6 | 09:33:37.828751 db@open done T·4.167625ms
7 | 09:33:37.859690 db@close closing
8 | 09:33:37.859770 db@close done T·79.375µs
9 |
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/data/MANIFEST-000000:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/test/testdata/v0/test/keymap/data/MANIFEST-000000
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/initialized:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Layr-Labs/eigenda/9192afc4f1207c444d00fdf838cf90f87ee07b26/litt/test/testdata/v0/test/keymap/initialized
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/keymap/keymap-type.txt:
--------------------------------------------------------------------------------
1 | LevelDBKeymap
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/segments/0-0.values:
--------------------------------------------------------------------------------
1 |
2 | VpmOg5d6Ya vxwc3n4trq3D VT0tSNW17vJ i1BYGFSfM3P dCXgS4SlWnmo GHinZXfMWGfZqfrEUj
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/segments/0-1.values:
--------------------------------------------------------------------------------
1 |
haThtIFGmQ2a1 zEpiTYqMnM4AEpQecs XzBcPMUZyryB
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/segments/0-2.values:
--------------------------------------------------------------------------------
1 | w4XuLp12Gg6pWll zol4hrMcjKh4wXBW0X4
ZuvhlCcIRKcdn Al7tASqhEtUxwv8O8
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/segments/0-3.values:
--------------------------------------------------------------------------------
1 | uhI9oNwGZvOR AtkhY6eBDwJjPC9Yq0 6vZh6B840MN8W8Edx XiM14PxeApDwgCwoWl
2 | l1R6uK4eCQ 3G5RAf58WUmqTEQed
--------------------------------------------------------------------------------
/litt/test/testdata/v0/test/segments/0.keys:
--------------------------------------------------------------------------------
1 |
fZLvo7jDSSlWP
2 | sg7u1aDylz
f8y4xuM57qFQg EdLROPjF0lrQR5Y
2VFfY7yWW5cEs iMV7t0BLFhp8WDt3z zO3XDUKdmFWhzwL8 Cl74jcT7McogOuI K3LPe7EsYmzmZfmJSr b2yGXFlpHJuQwpCaa * fycSvFVXdL7 ; ivHrCBthr8qu - bK6ShP3Ji9FN <