Copy disabled (too large)
Download .txt
Showing preview only (14,643K chars total). Download the full file to get everything.
Repository: datahaven-xyz/datahaven
Branch: main
Commit: e60363ecc3e7
Files: 989
Total size: 13.8 MB
Directory structure:
gitextract_oas6zffh/
├── .github/
│ ├── CODEOWNERS
│ ├── workflow-templates/
│ │ ├── build-prod-binary/
│ │ │ └── action.yml
│ │ └── publish-docker/
│ │ └── action.yml
│ └── workflows/
│ ├── CI.yml
│ ├── actions/
│ │ ├── cleanup-runner/
│ │ │ └── action.yml
│ │ └── setup-env/
│ │ └── action.yml
│ ├── enforce-pr-labels.yml
│ ├── release.yml
│ ├── task-build-operator.yml
│ ├── task-build-static-operator.yaml
│ ├── task-check-licenses.yml
│ ├── task-check-metadata.yml
│ ├── task-docker-ci.yml
│ ├── task-docker-release-validator-set-submitter.yml
│ ├── task-docker-release.yml
│ ├── task-e2e.yml
│ ├── task-foundry-tests.yml
│ ├── task-moonwall-tests.yml
│ ├── task-publish-binary.yml
│ ├── task-publish-runtime.yml
│ ├── task-rust-lint.yml
│ ├── task-rust-tests.yml
│ ├── task-storage-layout.yml
│ ├── task-ts-build.yml
│ ├── task-ts-lint.yml
│ ├── task-warm-sccache.yml
│ └── weekly-audit.yml
├── .gitignore
├── .gitmodules
├── CLAUDE.md
├── LICENSE
├── README.md
├── biome.json
├── contracts/
│ ├── .gitignore
│ ├── README.md
│ ├── VERSION
│ ├── config/
│ │ ├── anvil.json
│ │ ├── example.jsonc
│ │ ├── mainnet-ethereum.json
│ │ ├── stagenet-hoodi.json
│ │ └── testnet-hoodi.json
│ ├── deployments/
│ │ ├── anvil-agent-info.json
│ │ ├── anvil-rewards-info.json
│ │ ├── anvil.json
│ │ ├── hoodi.json
│ │ ├── metadata.json
│ │ ├── stagenet-hoodi-rewards-info.json
│ │ ├── stagenet-hoodi.json
│ │ ├── state-diff.checksum
│ │ └── state-diff.json
│ ├── foundry.toml
│ ├── script/
│ │ ├── deploy/
│ │ │ ├── Config.sol
│ │ │ ├── DeployBase.s.sol
│ │ │ ├── DeployImplementation.s.sol
│ │ │ ├── DeployLive.s.sol
│ │ │ ├── DeployLocal.s.sol
│ │ │ └── DeployParams.s.sol
│ │ ├── fixtures/
│ │ │ └── DataHavenServiceManagerBadLayout.sol
│ │ ├── transact/
│ │ │ ├── AllocateOperatorStake.s.sol
│ │ │ ├── SignUpOperatorBase.s.sol
│ │ │ └── SignUpValidator.s.sol
│ │ └── utils/
│ │ ├── Accounts.sol
│ │ ├── DHScriptStorage.s.sol
│ │ ├── ELScriptStorage.s.sol
│ │ ├── Logging.sol
│ │ ├── SnowbridgeScriptStorage.s.sol
│ │ └── ValidatorsUtils.sol
│ ├── scripts/
│ │ ├── check-storage-layout-negative.sh
│ │ └── check-storage-layout.sh
│ ├── src/
│ │ ├── DataHavenServiceManager.sol
│ │ ├── interfaces/
│ │ │ └── IDataHavenServiceManager.sol
│ │ └── libraries/
│ │ ├── DataHavenSnowbridgeMessages.sol
│ │ └── MerkleUtils.sol
│ ├── storage-snapshots/
│ │ ├── DataHavenServiceManager.storage.json
│ │ └── README.md
│ └── test/
│ ├── MessageEncoding.t.sol
│ ├── OperatorAddressMappings.t.sol
│ ├── RewardsSubmitter.t.sol
│ ├── Slashing.t.sol
│ ├── SnowbridgeIntegration.t.sol
│ ├── ValidatorSetSelection.t.sol
│ ├── ValidatorSetSubmitter.t.sol
│ ├── mocks/
│ │ ├── PermissionControllerMock.sol
│ │ ├── RewardsCoordinatorMock.sol
│ │ └── SnowbridgeGatewayMock.sol
│ ├── storage/
│ │ └── StorageLayout.t.sol
│ └── utils/
│ ├── AVSDeployer.sol
│ ├── ERC20FixedSupply.sol
│ ├── SnowbridgeAndAVSDeployer.sol
│ └── TestUtils.sol
├── deploy/
│ ├── README.md
│ ├── chainspecs/
│ │ ├── dh-testnet-spec-base.json
│ │ └── dh-testnet-spec-raw.json
│ ├── charts/
│ │ ├── backend/
│ │ │ ├── Chart.yaml
│ │ │ ├── README.md
│ │ │ ├── storagehub/
│ │ │ │ └── sh-mspbackend.yaml
│ │ │ ├── templates/
│ │ │ │ ├── _helpers.tpl
│ │ │ │ ├── configmap.yaml
│ │ │ │ ├── deployment.yaml
│ │ │ │ ├── ingress.yaml
│ │ │ │ ├── secret.yaml
│ │ │ │ ├── service.yaml
│ │ │ │ └── serviceaccount.yaml
│ │ │ └── values.yaml
│ │ ├── node/
│ │ │ ├── .gitignore
│ │ │ ├── .helmignore
│ │ │ ├── Chart.yaml
│ │ │ ├── README.md
│ │ │ ├── datahaven/
│ │ │ │ ├── dh-bootnode.yaml
│ │ │ │ └── dh-validator.yaml
│ │ │ ├── storagehub/
│ │ │ │ ├── sh-bspnode.yaml
│ │ │ │ ├── sh-fisherman.yaml
│ │ │ │ ├── sh-idxnode.yaml
│ │ │ │ └── sh-mspnode.yaml
│ │ │ ├── templates/
│ │ │ │ ├── _helpers.tpl
│ │ │ │ ├── customChainspecConfigmap.yaml
│ │ │ │ ├── customNodeKeySecret.yaml
│ │ │ │ ├── hpa.yaml
│ │ │ │ ├── ingress-per-replica.yaml
│ │ │ │ ├── ingress.yaml
│ │ │ │ ├── keys.yaml
│ │ │ │ ├── podDisruptionBudget.yaml
│ │ │ │ ├── service.yaml
│ │ │ │ ├── serviceAccount.yaml
│ │ │ │ ├── serviceMonitor.yaml
│ │ │ │ └── statefulset.yaml
│ │ │ └── values.yaml
│ │ └── relay/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── configs/
│ │ │ ├── beacon-relay.json
│ │ │ ├── beefy-relay.json
│ │ │ ├── execution-relay.json
│ │ │ └── solochain-relay.json
│ │ ├── snowbridge/
│ │ │ ├── dh-beacon-relay.yaml
│ │ │ ├── dh-beefy-relay.yaml
│ │ │ ├── dh-execution-relay.yaml
│ │ │ └── dh-solochain-relay.yaml
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── configmap.yaml
│ │ │ ├── cronjob.yml
│ │ │ ├── deployment.yaml
│ │ │ ├── pvc.yaml
│ │ │ ├── secret.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ └── values.yaml
│ └── environments/
│ ├── local/
│ │ ├── dh-beacon-relay.yaml
│ │ ├── dh-beefy-relay.yaml
│ │ ├── dh-bootnode.yaml
│ │ ├── dh-execution-relay.yaml
│ │ ├── dh-solochain-relay.yaml
│ │ ├── dh-validator.yaml
│ │ ├── sh-bspnode.yaml
│ │ ├── sh-fisherman.yaml
│ │ ├── sh-idxnode-db.yaml
│ │ ├── sh-idxnode.yaml
│ │ ├── sh-mspbackend.yaml
│ │ ├── sh-mspnode.yaml
│ │ └── traefik.yaml
│ ├── stagenet/
│ │ ├── dh-beacon-relay.yaml
│ │ ├── dh-beefy-relay.yaml
│ │ ├── dh-bootnode.yaml
│ │ ├── dh-execution-relay.yaml
│ │ ├── dh-solochain-relay.yaml
│ │ ├── dh-validator.yaml
│ │ ├── sh-bspnode.yaml
│ │ ├── sh-fisherman.yaml
│ │ ├── sh-idxnode-db.yaml
│ │ ├── sh-idxnode.yaml
│ │ ├── sh-mspbackend.yaml
│ │ └── sh-mspnode.yaml
│ └── testnet/
│ ├── dh-bootnode.yaml
│ └── dh-validator.yaml
├── docker/
│ ├── datahaven-build.Dockerfile
│ ├── datahaven-dev.Dockerfile
│ └── datahaven-production.Dockerfile
├── file_header.txt
├── operator/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── DOCKER-COMPOSE.md
│ ├── Dockerfile
│ ├── README.md
│ ├── benchmarking/
│ │ └── frame-weight-template.hbs
│ ├── docker-compose.yml
│ ├── node/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ └── src/
│ │ ├── benchmarking.rs
│ │ ├── chain_spec/
│ │ │ ├── mainnet.rs
│ │ │ ├── mod.rs
│ │ │ ├── stagenet.rs
│ │ │ └── testnet.rs
│ │ ├── cli.rs
│ │ ├── client.rs
│ │ ├── command.rs
│ │ ├── config.rs
│ │ ├── consensus.rs
│ │ ├── eth.rs
│ │ ├── main.rs
│ │ ├── rpc.rs
│ │ └── service.rs
│ ├── pallets/
│ │ ├── datahaven-native-transfer/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ ├── ethereum-client/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── benchmark.md
│ │ │ ├── fixtures/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarking/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── config/
│ │ │ │ │ ├── altair.rs
│ │ │ │ │ ├── electra.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── debug_merkle.rs
│ │ │ │ ├── functions.rs
│ │ │ │ ├── impls.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── mock.rs
│ │ │ │ ├── mock_electra.rs
│ │ │ │ ├── tests.rs
│ │ │ │ ├── tests_electra.rs
│ │ │ │ ├── types.rs
│ │ │ │ └── weights.rs
│ │ │ └── tests/
│ │ │ ├── electra/
│ │ │ │ ├── execution-proof.json
│ │ │ │ ├── finalized-header-update.json
│ │ │ │ ├── inbound-message.json
│ │ │ │ ├── initial-checkpoint.json
│ │ │ │ ├── next-finalized-header-update.json
│ │ │ │ ├── next-sync-committee-update.json
│ │ │ │ └── sync-committee-update.json
│ │ │ └── fixtures/
│ │ │ ├── execution-proof.json
│ │ │ ├── finalized-header-update.json
│ │ │ ├── inbound-message.json
│ │ │ ├── initial-checkpoint.json
│ │ │ ├── next-finalized-header-update.json
│ │ │ ├── next-sync-committee-update.json
│ │ │ ├── sync-committee-update-period-0-newer.json
│ │ │ ├── sync-committee-update-period-0-older.json
│ │ │ ├── sync-committee-update-period-0.json
│ │ │ └── sync-committee-update.json
│ │ ├── external-validator-slashes/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ ├── external-validators/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── traits.rs
│ │ │ └── weights.rs
│ │ ├── external-validators-rewards/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── types.rs
│ │ │ └── weights.rs
│ │ ├── grandpa-benchmarking/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ └── lib.rs
│ │ ├── inbound-queue-v2/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── fixtures/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── lib.rs
│ │ │ │ └── register_token.rs
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── message_processors.rs
│ │ │ ├── mock.rs
│ │ │ ├── test.rs
│ │ │ └── weights.rs
│ │ ├── outbound-commitment-store/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── outbound-queue-v2/
│ │ │ ├── Cargo.toml
│ │ │ ├── runtime-api/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── api.rs
│ │ │ ├── benchmarking.rs
│ │ │ ├── fixture.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── process_message_impl.rs
│ │ │ ├── send_message_impl.rs
│ │ │ ├── test.rs
│ │ │ ├── types.rs
│ │ │ └── weights.rs
│ │ ├── proxy-genesis-companion/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── session-benchmarking/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ └── lib.rs
│ │ ├── system/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── runtime-api/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── README.md
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── api.rs
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── migration.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ └── system-v2/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── runtime-api/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ ├── api.rs
│ │ ├── benchmarking.rs
│ │ ├── lib.rs
│ │ ├── mock.rs
│ │ ├── tests.rs
│ │ └── weights.rs
│ ├── precompiles/
│ │ ├── batch/
│ │ │ ├── Batch.sol
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── call-permit/
│ │ │ ├── CallPermit.sol
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── collective/
│ │ │ ├── Cargo.toml
│ │ │ ├── Collective.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── conviction-voting/
│ │ │ ├── Cargo.toml
│ │ │ ├── ConvictionVoting.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── datahaven-native-transfer/
│ │ │ ├── Cargo.toml
│ │ │ ├── DataHavenNativeTransfer.sol
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── erc20-balances/
│ │ │ ├── Cargo.toml
│ │ │ ├── ERC20.sol
│ │ │ ├── Permit.sol
│ │ │ └── src/
│ │ │ ├── eip2612.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── identity/
│ │ │ ├── Cargo.toml
│ │ │ ├── Identity.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── precompile-registry/
│ │ │ ├── Cargo.toml
│ │ │ ├── PrecompileRegistry.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── preimage/
│ │ │ ├── Cargo.toml
│ │ │ ├── Preimage.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── proxy/
│ │ │ ├── Cargo.toml
│ │ │ ├── Proxy.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ └── referenda/
│ │ ├── Cargo.toml
│ │ ├── Referenda.sol
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── mock.rs
│ │ └── tests.rs
│ ├── primitives/
│ │ ├── bridge/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── snowbridge/
│ │ ├── beacon/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── bits.rs
│ │ │ ├── bls.rs
│ │ │ ├── config.rs
│ │ │ ├── lib.rs
│ │ │ ├── merkle_proof.rs
│ │ │ ├── receipt.rs
│ │ │ ├── serde_utils.rs
│ │ │ ├── ssz.rs
│ │ │ ├── types.rs
│ │ │ └── updates.rs
│ │ ├── bridge-hub-common/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── digest_item.rs
│ │ │ ├── lib.rs
│ │ │ ├── message_queue.rs
│ │ │ └── xcm_version.rs
│ │ ├── core/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── src/
│ │ │ │ ├── lib.rs
│ │ │ │ ├── location.rs
│ │ │ │ ├── operating_mode.rs
│ │ │ │ ├── pricing.rs
│ │ │ │ ├── reward.rs
│ │ │ │ ├── ringbuffer.rs
│ │ │ │ ├── sparse_bitmap.rs
│ │ │ │ └── tests.rs
│ │ │ └── tests/
│ │ │ ├── fixtures/
│ │ │ │ └── packet.scale
│ │ │ └── mod.rs
│ │ ├── ethereum/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── header.rs
│ │ │ ├── lib.rs
│ │ │ ├── log.rs
│ │ │ ├── mpt.rs
│ │ │ └── receipt.rs
│ │ ├── inbound-queue/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── v1.rs
│ │ │ └── v2/
│ │ │ ├── converter.rs
│ │ │ ├── message.rs
│ │ │ ├── mod.rs
│ │ │ └── traits.rs
│ │ ├── merkle-tree/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── outbound-queue/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── v1/
│ │ │ │ ├── message.rs
│ │ │ │ └── mod.rs
│ │ │ └── v2/
│ │ │ ├── converter/
│ │ │ │ ├── convert.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tests.rs
│ │ │ ├── delivery_receipt.rs
│ │ │ ├── exporter.rs
│ │ │ ├── message.rs
│ │ │ └── mod.rs
│ │ ├── test-utils/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock_origin.rs
│ │ │ ├── mock_outbound_queue.rs
│ │ │ └── mock_xcm.rs
│ │ └── verification/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── lib.rs
│ ├── runtime/
│ │ ├── README.md
│ │ ├── common/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── constants.rs
│ │ │ ├── deal_with_fees.rs
│ │ │ ├── impl_on_charge_evm_transaction.rs
│ │ │ ├── inflation.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── rewards_adapter.rs
│ │ │ ├── safe_mode.rs
│ │ │ └── slashes_adapter.rs
│ │ ├── mainnet/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── configs/
│ │ │ │ │ ├── governance/
│ │ │ │ │ │ ├── councils.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── origins.rs
│ │ │ │ │ │ ├── referenda.rs
│ │ │ │ │ │ └── tracks.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── runtime_params.rs
│ │ │ │ │ └── storagehub/
│ │ │ │ │ ├── client.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── genesis_config_presets.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── precompiles.rs
│ │ │ │ └── weights/
│ │ │ │ ├── frame_system.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pallet_babe.rs
│ │ │ │ ├── pallet_balances.rs
│ │ │ │ ├── pallet_beefy_mmr.rs
│ │ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ │ ├── pallet_conviction_voting.rs
│ │ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ │ ├── pallet_evm.rs
│ │ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ │ ├── pallet_external_validators.rs
│ │ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ │ ├── pallet_file_system.rs
│ │ │ │ ├── pallet_grandpa.rs
│ │ │ │ ├── pallet_im_online.rs
│ │ │ │ ├── pallet_message_queue.rs
│ │ │ │ ├── pallet_migrations.rs
│ │ │ │ ├── pallet_mmr.rs
│ │ │ │ ├── pallet_multisig.rs
│ │ │ │ ├── pallet_nfts.rs
│ │ │ │ ├── pallet_parameters.rs
│ │ │ │ ├── pallet_payment_streams.rs
│ │ │ │ ├── pallet_preimage.rs
│ │ │ │ ├── pallet_proofs_dealer.rs
│ │ │ │ ├── pallet_proxy.rs
│ │ │ │ ├── pallet_randomness.rs
│ │ │ │ ├── pallet_referenda.rs
│ │ │ │ ├── pallet_safe_mode.rs
│ │ │ │ ├── pallet_scheduler.rs
│ │ │ │ ├── pallet_session.rs
│ │ │ │ ├── pallet_storage_providers.rs
│ │ │ │ ├── pallet_sudo.rs
│ │ │ │ ├── pallet_timestamp.rs
│ │ │ │ ├── pallet_transaction_payment.rs
│ │ │ │ ├── pallet_treasury.rs
│ │ │ │ ├── pallet_tx_pause.rs
│ │ │ │ ├── pallet_utility.rs
│ │ │ │ ├── pallet_whitelist.rs
│ │ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_system.rs
│ │ │ │ └── snowbridge_pallet_system_v2.rs
│ │ │ └── tests/
│ │ │ ├── common.rs
│ │ │ ├── fee_adjustment.rs
│ │ │ ├── governance/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── councils.rs
│ │ │ │ ├── integration.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── origins.rs
│ │ │ │ ├── proxy.rs
│ │ │ │ └── referenda.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── native_token_transfer.rs
│ │ │ ├── proxy.rs
│ │ │ ├── safe_mode_tx_pause.rs
│ │ │ └── treasury.rs
│ │ ├── stagenet/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── configs/
│ │ │ │ │ ├── governance/
│ │ │ │ │ │ ├── councils.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── origins.rs
│ │ │ │ │ │ ├── referenda.rs
│ │ │ │ │ │ └── tracks.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── runtime_params.rs
│ │ │ │ │ └── storagehub/
│ │ │ │ │ ├── client.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── genesis_config_presets.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── precompiles.rs
│ │ │ │ └── weights/
│ │ │ │ ├── frame_system.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pallet_babe.rs
│ │ │ │ ├── pallet_balances.rs
│ │ │ │ ├── pallet_beefy_mmr.rs
│ │ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ │ ├── pallet_conviction_voting.rs
│ │ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ │ ├── pallet_evm.rs
│ │ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ │ ├── pallet_external_validators.rs
│ │ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ │ ├── pallet_file_system.rs
│ │ │ │ ├── pallet_grandpa.rs
│ │ │ │ ├── pallet_im_online.rs
│ │ │ │ ├── pallet_message_queue.rs
│ │ │ │ ├── pallet_migrations.rs
│ │ │ │ ├── pallet_mmr.rs
│ │ │ │ ├── pallet_multisig.rs
│ │ │ │ ├── pallet_nfts.rs
│ │ │ │ ├── pallet_parameters.rs
│ │ │ │ ├── pallet_payment_streams.rs
│ │ │ │ ├── pallet_preimage.rs
│ │ │ │ ├── pallet_proofs_dealer.rs
│ │ │ │ ├── pallet_proxy.rs
│ │ │ │ ├── pallet_randomness.rs
│ │ │ │ ├── pallet_referenda.rs
│ │ │ │ ├── pallet_safe_mode.rs
│ │ │ │ ├── pallet_scheduler.rs
│ │ │ │ ├── pallet_session.rs
│ │ │ │ ├── pallet_storage_providers.rs
│ │ │ │ ├── pallet_sudo.rs
│ │ │ │ ├── pallet_timestamp.rs
│ │ │ │ ├── pallet_transaction_payment.rs
│ │ │ │ ├── pallet_treasury.rs
│ │ │ │ ├── pallet_tx_pause.rs
│ │ │ │ ├── pallet_utility.rs
│ │ │ │ ├── pallet_whitelist.rs
│ │ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_system.rs
│ │ │ │ └── snowbridge_pallet_system_v2.rs
│ │ │ └── tests/
│ │ │ ├── common.rs
│ │ │ ├── fee_adjustment.rs
│ │ │ ├── governance/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── councils.rs
│ │ │ │ ├── integration.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── origins.rs
│ │ │ │ ├── proxy.rs
│ │ │ │ └── referenda.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── native_token_transfer.rs
│ │ │ ├── proxy.rs
│ │ │ ├── safe_mode_tx_pause.rs
│ │ │ ├── snowbridge_message_processor.rs
│ │ │ └── treasury.rs
│ │ └── testnet/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── src/
│ │ │ ├── benchmarks.rs
│ │ │ ├── configs/
│ │ │ │ ├── governance/
│ │ │ │ │ ├── councils.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── origins.rs
│ │ │ │ │ ├── referenda.rs
│ │ │ │ │ └── tracks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── runtime_params.rs
│ │ │ │ └── storagehub/
│ │ │ │ ├── client.rs
│ │ │ │ └── mod.rs
│ │ │ ├── genesis_config_presets.rs
│ │ │ ├── lib.rs
│ │ │ ├── precompiles.rs
│ │ │ └── weights/
│ │ │ ├── frame_system.rs
│ │ │ ├── mod.rs
│ │ │ ├── pallet_babe.rs
│ │ │ ├── pallet_balances.rs
│ │ │ ├── pallet_beefy_mmr.rs
│ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ ├── pallet_conviction_voting.rs
│ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ ├── pallet_evm.rs
│ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ ├── pallet_external_validators.rs
│ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ ├── pallet_file_system.rs
│ │ │ ├── pallet_grandpa.rs
│ │ │ ├── pallet_identity.rs
│ │ │ ├── pallet_im_online.rs
│ │ │ ├── pallet_message_queue.rs
│ │ │ ├── pallet_migrations.rs
│ │ │ ├── pallet_mmr.rs
│ │ │ ├── pallet_multisig.rs
│ │ │ ├── pallet_nfts.rs
│ │ │ ├── pallet_parameters.rs
│ │ │ ├── pallet_payment_streams.rs
│ │ │ ├── pallet_preimage.rs
│ │ │ ├── pallet_proofs_dealer.rs
│ │ │ ├── pallet_proxy.rs
│ │ │ ├── pallet_randomness.rs
│ │ │ ├── pallet_referenda.rs
│ │ │ ├── pallet_safe_mode.rs
│ │ │ ├── pallet_scheduler.rs
│ │ │ ├── pallet_session.rs
│ │ │ ├── pallet_storage_providers.rs
│ │ │ ├── pallet_sudo.rs
│ │ │ ├── pallet_timestamp.rs
│ │ │ ├── pallet_transaction_payment.rs
│ │ │ ├── pallet_treasury.rs
│ │ │ ├── pallet_tx_pause.rs
│ │ │ ├── pallet_utility.rs
│ │ │ ├── pallet_whitelist.rs
│ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ ├── snowbridge_pallet_system.rs
│ │ │ └── snowbridge_pallet_system_v2.rs
│ │ └── tests/
│ │ ├── common.rs
│ │ ├── fee_adjustment.rs
│ │ ├── governance/
│ │ │ ├── benchmarks.rs
│ │ │ ├── councils.rs
│ │ │ ├── integration.rs
│ │ │ ├── mod.rs
│ │ │ ├── origins.rs
│ │ │ ├── proxy.rs
│ │ │ └── referenda.rs
│ │ ├── lib.rs
│ │ ├── migrations.rs
│ │ ├── native_token_transfer.rs
│ │ ├── proxy.rs
│ │ ├── safe_mode_tx_pause.rs
│ │ └── treasury.rs
│ ├── rust-toolchain.toml
│ └── scripts/
│ ├── build-runtime-srtool.sh
│ ├── docker-entrypoint.sh
│ ├── docker-healthcheck.sh
│ ├── docker-prepare.sh
│ ├── run-benchmarks.sh
│ ├── sort-cargo-deps.sh
│ ├── test_message_encoding.sh
│ └── verify-licenses.sh
├── specs/
│ ├── validator-set-selection/
│ │ └── validator-set-selection.md
│ └── validator-set-submission/
│ └── validator-set-submission.md
├── taplo.toml
├── test/
│ ├── .bun-version
│ ├── .dockerignore
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .papi/
│ │ ├── descriptors/
│ │ │ ├── .gitignore
│ │ │ └── package.json
│ │ ├── metadata/
│ │ │ └── datahaven.scale
│ │ └── polkadot-api.json
│ ├── README.md
│ ├── biome.json
│ ├── bunfig.toml
│ ├── cli/
│ │ ├── handlers/
│ │ │ ├── common/
│ │ │ │ ├── checks.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── kubernetes.ts
│ │ │ ├── contracts/
│ │ │ │ ├── README.md
│ │ │ │ ├── beefy-checkpoint.ts
│ │ │ │ ├── checks.ts
│ │ │ │ ├── deploy.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── rewards-origin.ts
│ │ │ │ ├── status.ts
│ │ │ │ ├── update-metadata.ts
│ │ │ │ ├── upgrade.ts
│ │ │ │ └── verify.ts
│ │ │ ├── deploy/
│ │ │ │ ├── cleanup.ts
│ │ │ │ ├── contracts.ts
│ │ │ │ ├── datahaven.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kurtosis.ts
│ │ │ │ ├── parameters.ts
│ │ │ │ ├── relayer.ts
│ │ │ │ ├── storagehub.ts
│ │ │ │ └── validator.ts
│ │ │ ├── exec/
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── launch/
│ │ │ │ ├── contracts.ts
│ │ │ │ ├── datahaven.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kurtosis.ts
│ │ │ │ ├── parameters.ts
│ │ │ │ ├── relayer.ts
│ │ │ │ ├── storagehub.ts
│ │ │ │ ├── summary.ts
│ │ │ │ └── validator.ts
│ │ │ └── stop/
│ │ │ └── index.ts
│ │ └── index.ts
│ ├── configs/
│ │ ├── contracts/
│ │ │ └── config.ts
│ │ ├── kurtosis/
│ │ │ └── minimal.yaml
│ │ ├── parameters/
│ │ │ └── datahaven-parameters.json
│ │ ├── snowbridge/
│ │ │ ├── genesis.json
│ │ │ ├── local/
│ │ │ │ ├── beacon-relay.json
│ │ │ │ ├── beefy-relay.json
│ │ │ │ ├── execution-relay.json
│ │ │ │ └── solochain-relay.json
│ │ │ ├── stagenet/
│ │ │ │ ├── beacon-relay.json
│ │ │ │ ├── beefy-relay.json
│ │ │ │ ├── execution-relay.json
│ │ │ │ └── solochain-relay.json
│ │ │ └── tanssi-examples/
│ │ │ ├── beacon-relay.json
│ │ │ ├── beefy-relay.json
│ │ │ ├── dump-initial-checkpoint.json
│ │ │ ├── execution-relay-asset-hub.json
│ │ │ ├── execution-relay.json
│ │ │ ├── genesis.json
│ │ │ ├── snowbridge_contracts.json
│ │ │ ├── substrate-relay-asset-hub.json
│ │ │ ├── substrate-relay-primary.json
│ │ │ ├── substrate-relay-secondary.json
│ │ │ └── symbiotic_contracts.json
│ │ └── validator-set.json
│ ├── contract-bindings/
│ │ ├── generated.ts
│ │ └── index.ts
│ ├── docker/
│ │ └── crossbuild-mac-libpq.dockerfile
│ ├── docs/
│ │ ├── E2E_FRAMEWORK_OVERVIEW.md
│ │ └── deployment.md
│ ├── e2e/
│ │ ├── framework/
│ │ │ ├── connectors.ts
│ │ │ ├── index.ts
│ │ │ ├── manager.ts
│ │ │ ├── submitter.ts
│ │ │ ├── suite.ts
│ │ │ └── validators.ts
│ │ └── suites/
│ │ ├── native-token-transfer.test.ts
│ │ ├── rewards-message.test.ts
│ │ ├── slash.test.ts
│ │ ├── storagehub.test.ts
│ │ └── validator-set-update.test.ts
│ ├── launcher/
│ │ ├── contracts.ts
│ │ ├── datahaven.ts
│ │ ├── index.ts
│ │ ├── kurtosis.ts
│ │ ├── network/
│ │ │ └── index.ts
│ │ ├── parameters.ts
│ │ ├── relayers.ts
│ │ ├── storagehub-docker.ts
│ │ ├── types/
│ │ │ ├── index.ts
│ │ │ └── launchedNetwork.ts
│ │ ├── utils/
│ │ │ ├── checks.ts
│ │ │ ├── constants.ts
│ │ │ └── index.ts
│ │ └── validators.ts
│ ├── moonwall/
│ │ ├── contracts/
│ │ │ └── src/
│ │ │ ├── AccessListHelper.sol
│ │ │ ├── BloatedContract.sol
│ │ │ ├── BlockVariables.sol
│ │ │ ├── CallBatchFromConstructor.sol
│ │ │ ├── CallForwarder.sol
│ │ │ ├── ECContracts.sol
│ │ │ ├── EventEmitter.sol
│ │ │ ├── FailingConstructor.sol
│ │ │ ├── Fibonacci.sol
│ │ │ ├── HasherChecker.sol
│ │ │ ├── Incrementor.sol
│ │ │ ├── Looper.sol
│ │ │ ├── MultiplyBy7.sol
│ │ │ ├── SelfDestruct.sol
│ │ │ ├── SimpleContractFactory.sol
│ │ │ ├── StateOverrideTest.sol
│ │ │ ├── StorageLoop.sol
│ │ │ ├── SubCallOOG.sol
│ │ │ └── dancun/
│ │ │ ├── ProxySuicide.sol
│ │ │ └── TransientStorage.sol
│ │ ├── helpers/
│ │ │ ├── block.ts
│ │ │ ├── constants.ts
│ │ │ ├── contracts.ts
│ │ │ ├── eth-transactions.ts
│ │ │ ├── evm.ts
│ │ │ ├── expect.ts
│ │ │ ├── fees.ts
│ │ │ ├── index.ts
│ │ │ ├── modexp.ts
│ │ │ ├── parameters.ts
│ │ │ ├── precompile-addresses.ts
│ │ │ ├── precompile-contract-calls.ts
│ │ │ └── transactions.ts
│ │ └── suites/
│ │ └── dev/
│ │ ├── common/
│ │ │ ├── test-block/
│ │ │ │ ├── test-block-1.ts
│ │ │ │ ├── test-block-2.ts
│ │ │ │ ├── test-block-gas.ts
│ │ │ │ ├── test-block-genesis.ts
│ │ │ │ └── test-block-safe-mode.ts
│ │ │ ├── test-contract/
│ │ │ │ └── test-contract-creation.ts
│ │ │ ├── test-precompile/
│ │ │ │ └── test-precompile-batch.ts
│ │ │ └── test-proxy/
│ │ │ └── test-proxy-balance.ts
│ │ └── stagenet/
│ │ ├── balance/
│ │ │ ├── test-balance-existential.ts
│ │ │ ├── test-balance-extrinsics.ts
│ │ │ ├── test-balance-genesis.ts
│ │ │ └── test-balance-transfer.ts
│ │ ├── contract/
│ │ │ ├── test-contract-delegate-call.ts
│ │ │ ├── test-contract-error.ts
│ │ │ ├── test-contract-event.ts
│ │ │ ├── test-contract-evm-limits.ts
│ │ │ ├── test-contract-fibonacci.ts
│ │ │ ├── test-contract-incr-loop.ts
│ │ │ ├── test-contract-loop-cost.ts
│ │ │ ├── test-contract-methods.ts
│ │ │ ├── test-contract-variables.ts
│ │ │ ├── test-eip-6780.ts
│ │ │ └── test-eip1153.ts
│ │ ├── eth-call/
│ │ │ └── test-eth-call-state-override.ts
│ │ ├── eth-fee/
│ │ │ ├── test-eth-fee-history.ts
│ │ │ ├── test-eth-paysFee.ts
│ │ │ └── test-eth-txn-weights.ts
│ │ ├── eth-pool/
│ │ │ ├── test-eth-pool-discard.ts
│ │ │ ├── test-eth-pool-error.ts
│ │ │ ├── test-eth-pool-multiple.ts
│ │ │ ├── test-eth-pool-nonce-future.ts
│ │ │ └── test-eth-pool-resubmit-txn.ts
│ │ ├── eth-rpc/
│ │ │ ├── test-eth-rpc-constants.ts
│ │ │ ├── test-eth-rpc-deprecated.ts
│ │ │ ├── test-eth-rpc-log-filtering.ts
│ │ │ ├── test-eth-rpc-transaction-receipt.ts
│ │ │ ├── test-eth-rpc-tx-index.ts
│ │ │ └── test-eth-rpc-version.ts
│ │ ├── eth-tx/
│ │ │ ├── test-eth-tx-access-list.ts
│ │ │ ├── test-eth-tx-native-transfer.ts
│ │ │ ├── test-eth-tx-size.ts
│ │ │ ├── test-eth-tx-types.ts
│ │ │ └── test-test-tx-nonce.ts
│ │ ├── ethers/
│ │ │ └── test-ethers.ts
│ │ ├── evm/
│ │ │ ├── test-pallet-evm-overflow.ts
│ │ │ └── test-pallet-evm-transfer.ts
│ │ ├── filter/
│ │ │ ├── test-filter-api-creation.ts
│ │ │ ├── test-filter-api-pending.ts
│ │ │ └── test-filter-api-polling.ts
│ │ ├── gas/
│ │ │ ├── test-gas-contract-creation.ts
│ │ │ ├── test-gas-estimation-allcontracts.ts
│ │ │ ├── test-gas-estimation-contracts.ts
│ │ │ ├── test-gas-estimation-multiply.ts
│ │ │ └── test-gas-estimation-subcall-oog.ts
│ │ ├── multisig/
│ │ │ └── test-multisigs.ts
│ │ ├── node-rpc/
│ │ │ └── test-node-rpc-peer.ts
│ │ ├── polkadot-js/
│ │ │ ├── test-polkadot-api.ts
│ │ │ └── test-polkadot-chain-info.ts
│ │ ├── precompile/
│ │ │ ├── test-precompile-blake2.ts
│ │ │ ├── test-precompile-bn128-bounds.ts
│ │ │ ├── test-precompile-bn128add.ts
│ │ │ ├── test-precompile-bn128mul.ts
│ │ │ ├── test-precompile-bn128pairing.ts
│ │ │ ├── test-precompile-ecrecover.ts
│ │ │ ├── test-precompile-erc20-overflow.ts
│ │ │ ├── test-precompile-erc20.ts
│ │ │ ├── test-precompile-identity.ts
│ │ │ ├── test-precompile-identity10.ts
│ │ │ ├── test-precompile-identity11.ts
│ │ │ ├── test-precompile-identity12.ts
│ │ │ ├── test-precompile-identity13.ts
│ │ │ ├── test-precompile-identity14.ts
│ │ │ ├── test-precompile-identity2.ts
│ │ │ ├── test-precompile-identity3.ts
│ │ │ ├── test-precompile-identity4.ts
│ │ │ ├── test-precompile-identity5.ts
│ │ │ ├── test-precompile-identity6.ts
│ │ │ ├── test-precompile-identity7.ts
│ │ │ ├── test-precompile-identity8.ts
│ │ │ ├── test-precompile-identity9.ts
│ │ │ ├── test-precompile-modexp.ts
│ │ │ ├── test-precompile-preimage.ts
│ │ │ ├── test-precompile-proxy.ts
│ │ │ ├── test-precompile-ripemd160.ts
│ │ │ └── test-precompile-sha3fips.ts
│ │ ├── proxy/
│ │ │ └── test-proxy.ts
│ │ ├── receipt/
│ │ │ ├── test-receipt-revert.ts
│ │ │ └── test-receipt.ts
│ │ ├── storage-growth/
│ │ │ └── test-evm-store-storage-growth.ts
│ │ ├── subscription/
│ │ │ ├── test-subscription-logs.ts
│ │ │ ├── test-subscription-logs2.ts
│ │ │ ├── test-subscription-pending.ts
│ │ │ └── test-subscription.ts
│ │ ├── sudo/
│ │ │ └── test-sudo.ts
│ │ └── txpool/
│ │ ├── test-txpool-future.ts
│ │ └── test-txpool-pending.ts
│ ├── moonwall.config.json
│ ├── package.json
│ ├── resources/
│ │ └── datahaven-integration-test-flow.md
│ ├── scripts/
│ │ ├── cargo-crossbuild.ts
│ │ ├── check-generated-state.ts
│ │ ├── compile-contracts.sh
│ │ ├── compile-contracts.ts
│ │ ├── contracts-checksum.ts
│ │ ├── deploy-contracts.ts
│ │ ├── fund-providers.ts
│ │ ├── fund-validators.ts
│ │ ├── generate-contracts.ts
│ │ ├── register-providers.ts
│ │ ├── send-txn.ts
│ │ ├── set-datahaven-parameters.ts
│ │ ├── setup-validators.ts
│ │ ├── test-parallel.ts
│ │ └── update-validator-set.ts
│ ├── tools/
│ │ └── validator-set-submitter/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── chain.ts
│ │ ├── config.ts
│ │ ├── config.yml
│ │ ├── main.ts
│ │ ├── metrics.ts
│ │ └── submitter.ts
│ ├── tsconfig.json
│ ├── utils/
│ │ ├── anvil.ts
│ │ ├── blockscout.ts
│ │ ├── constants.ts
│ │ ├── contracts/
│ │ │ └── versioning.ts
│ │ ├── contracts.ts
│ │ ├── docker.ts
│ │ ├── events.ts
│ │ ├── index.ts
│ │ ├── input.ts
│ │ ├── kurtosis.ts
│ │ ├── logger.ts
│ │ ├── papi.ts
│ │ ├── parameters.ts
│ │ ├── parser.ts
│ │ ├── rpc.ts
│ │ ├── service-mappings.ts
│ │ ├── shell.ts
│ │ ├── types.ts
│ │ ├── validators.ts
│ │ ├── viem.ts
│ │ └── waits.ts
│ └── wagmi.config.ts
└── tools/
├── .nvmrc
├── README.md
├── github/
│ ├── generate-release-body.ts
│ ├── generate-runtimes-body.ts
│ └── github-utils.ts
├── package.json
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CODEOWNERS
================================================
# Default code owners for the repo
# (This restriction will be lifted at some point)
* @datahaven-xyz/moonsong-perm @datahaven-xyz/moonsong-coredev
# Specific code owners for sensitive folders
/.github/ @datahaven-xyz/moonsong-perm @datahaven-xyz/opslayer-devops
/docker/ @datahaven-xyz/moonsong-perm @datahaven-xyz/opslayer-devops
/operator/scripts/ @datahaven-xyz/moonsong-perm @datahaven-xyz/opslayer-devops
/tools/github/ @datahaven-xyz/moonsong-perm @datahaven-xyz/opslayer-devops
================================================
FILE: .github/workflow-templates/build-prod-binary/action.yml
================================================
name: Build Production Binary
description: |
Builds production a DataHaven binary for a given CPU target
inputs:
target:
description: The CPU target for the binary
required: true
runs:
using: "composite"
steps:
- name: Download sources from artifacts
uses: actions/download-artifact@v4
with:
name: datahaven-sources
path: .
- name: Build production DataHaven
shell: bash
run: |
# Build DataHaven
# (we don't use volumes because of ownership/permissions issues)
docker build \
--tag prod --no-cache \
--build-arg="COMMIT=${{ github.event.inputs.sha }}" \
--build-arg="RUSTFLAGS=-C target-cpu=${{ inputs.target }}" \
--file ./docker/datahaven-production.Dockerfile \
.
# Copy DataHaven binary
docker rm -f dummy 2> /dev/null | true
docker create -ti --name dummy prod bash
docker cp dummy:/datahaven/datahaven-node datahaven-node
docker rm -f dummy
GLIBC_VERSION="$(objdump -T datahaven-node | grep "GLIBC_" | sed 's/.*GLIBC_\([.0-9]*\).*/\1/g' | sort -Vu | tail -1)"
if [[ $GLIBC_VERSION == "2.34" ]]; then
echo "✅ Using expected GLIBC version: ${GLIBC_VERSION}";
else
echo "❌ Unexpected GLIBC version: ${GLIBC_VERSION}";
exit 1;
fi
# Cleanup
docker rmi prod
- name: Save DataHaven node binary
shell: bash
run: |
mkdir -p build
cp datahaven-node build/datahaven-node-${{ inputs.target }}
- name: Upload binary
uses: actions/upload-artifact@v4
with:
name: datahaven-binaries-${{inputs.target}}
path: build/datahaven-node-${{inputs.target }}
================================================
FILE: .github/workflow-templates/publish-docker/action.yml
================================================
name: Publish docker image
description: |
Publish docker image tags to container registry
inputs:
dockerfile:
description: "Path to Dockerfile"
required: true
context:
description: "Build context path"
required: false
default: "."
registry:
description: "Container registry (ghcr.io or docker.io)"
required: false
default: "docker.io"
registry_username:
description: "Registry username"
required: true
registry_password:
description: "Registry password"
required: true
image_tags:
description: "Image tags (newline or comma-separated)"
required: true
image_title:
description: "Image title"
required: false
default: "DataHaven Node"
image_description:
description: "Image description"
required: false
default: "DataHaven blockchain node"
image_url:
description: "Image url"
required: false
default: "https://github.com/datahaven-xyz/datahaven"
image_source:
description: "Image source"
required: false
default: "https://github.com/datahaven-xyz/datahaven"
image_created:
description: "Image creation timestamp"
required: false
default: ""
image_revision:
description: "Image revision (git sha)"
required: false
default: ""
image_licenses:
description: "Image licenses"
required: false
default: "Apache-2.0"
cache_scope:
description: "Cache scope for GitHub Actions cache"
required: false
default: "docker-build"
build_args:
description: "Build arguments (newline or comma-separated)"
required: false
default: ""
platforms:
description: "Target platforms"
required: false
default: "linux/amd64"
runs:
using: "composite"
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: latest
driver-opts: |
image=moby/buildkit:master
- name: Login to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ inputs.registry }}
username: ${{ inputs.registry_username }}
password: ${{ inputs.registry_password }}
- name: Prepare labels
id: labels
shell: bash
run: |
CREATED="${{ inputs.image_created }}"
if [ -z "$CREATED" ]; then
CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
fi
REVISION="${{ inputs.image_revision }}"
if [ -z "$REVISION" ]; then
REVISION="${{ github.sha }}"
fi
echo "created=$CREATED" >> $GITHUB_OUTPUT
echo "revision=$REVISION" >> $GITHUB_OUTPUT
- name: Build and push image
id: docker_build
uses: docker/build-push-action@v6
with:
context: ${{ inputs.context }}
file: ${{ inputs.dockerfile }}
platforms: ${{ inputs.platforms }}
push: true
tags: ${{ inputs.image_tags }}
build-args: ${{ inputs.build_args }}
cache-from: type=gha,scope=${{ inputs.cache_scope }}
cache-to: type=gha,mode=max,scope=${{ inputs.cache_scope }}
provenance: mode=max
sbom: true
labels: |
org.opencontainers.image.title=${{ inputs.image_title }}
org.opencontainers.image.description=${{ inputs.image_description }}
org.opencontainers.image.url=${{ inputs.image_url }}
org.opencontainers.image.source=${{ inputs.image_source }}
org.opencontainers.image.created=${{ steps.labels.outputs.created }}
org.opencontainers.image.revision=${{ steps.labels.outputs.revision }}
org.opencontainers.image.licenses=${{ inputs.image_licenses }}
================================================
FILE: .github/workflows/CI.yml
================================================
#! Main CI Specification for DataHaven Repository
#!
#! This workflow runs validation checks on pull requests.
#! For main branch releases, see release.yml
name: CI
on:
workflow_dispatch:
push:
branches:
- perm-*
pull_request:
branches: [main]
# Permissions granted to reusable workflows
# Note: Called workflows (workflow_call) are constrained by these permissions
permissions:
contents: read
actions: write # Required for artifact upload/download in build-operator, moonwall-tests
packages: write # Required for docker-build-ci to push to ghcr.io
concurrency:
group: pr-checks-${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
# Tier 0 - Warm sccache for all Rust jobs
warm-sccache:
uses: ./.github/workflows/task-warm-sccache.yml
# First Tier - Build the binary (depends on warm cache)
build-operator:
needs: [warm-sccache]
uses: ./.github/workflows/task-build-operator.yml
# First Tier - Other parallel jobs
ts-build:
uses: ./.github/workflows/task-ts-build.yml
ts-lint:
uses: ./.github/workflows/task-ts-lint.yml
unit-tests:
needs: [warm-sccache]
uses: ./.github/workflows/task-rust-tests.yml
contract-tests:
uses: ./.github/workflows/task-foundry-tests.yml
storage-layout:
uses: ./.github/workflows/task-storage-layout.yml
rust-lint:
needs: [warm-sccache]
uses: ./.github/workflows/task-rust-lint.yml
# Second Tier - Jobs that depend on operator build
check-metadata:
needs: [build-operator]
uses: ./.github/workflows/task-check-metadata.yml
with:
binary-hash: ${{ needs.build-operator.outputs.binary-hash }}
docker-build-ci:
needs: [build-operator]
uses: ./.github/workflows/task-docker-ci.yml
# Note: GITHUB_TOKEN is automatically available to reusable workflows
with:
binary-hash: ${{ needs.build-operator.outputs.binary-hash }}
moonwall-tests:
needs: [build-operator]
uses: ./.github/workflows/task-moonwall-tests.yml
with:
binary-hash: ${{ needs.build-operator.outputs.binary-hash }}
# Third Tier - E2E tests depend on docker build
e2e-tests:
needs: [docker-build-ci]
uses: ./.github/workflows/task-e2e.yml
# Note: GITHUB_TOKEN is automatically available to reusable workflows
with:
image-tag: ${{ needs.docker-build-ci.outputs.image-tag }}
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
================================================
FILE: .github/workflows/actions/cleanup-runner/action.yml
================================================
name: "Cleanup Runner"
description: "Cleans up the runner environment to free up disk space"
runs:
using: "composite"
steps:
- name: Show disk space and largest directories before cleanup
shell: bash
run: |
echo "Overall disk space before cleanup (df -h /):"
df -h /
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/ before cleanup:"
sudo du -h --max-depth=1 /usr/ | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/local/lib before cleanup:"
sudo du -h --max-depth=1 /usr/local/lib | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/lib before cleanup:"
sudo du -h --max-depth=1 /usr/lib | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /opt before cleanup:"
sudo du -h --max-depth=1 /opt | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /opt/hostedtoolcache before cleanup:"
sudo du -h --max-depth=1 /opt/hostedtoolcache | sort -rh | head -n 10
- name: Free up disk space
id: prune
shell: bash
run: |
echo "--- Starting Cleanup ---"
sudo rm -rf \
/usr/local/lib/android \
/usr/local/lib/heroku \
/usr/share/dotnet \
/usr/lib/google-cloud-sdk \
/usr/lib/jvm \
/opt/hostedtoolcache/CodeQL \
/opt/hostedtoolcache/go \
/opt/hostedtoolcache/Python \
/opt/hostedtoolcache/Ruby \
/opt/hostedtoolcache/Java
sudo apt-get clean
echo "--- Cleanup Finished ---"
- name: Show disk space and largest directories after cleanup
shell: bash
run: |
echo "Overall disk space after cleanup (df -h /):"
df -h /
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/ after cleanup:"
sudo du -h --max-depth=1 /usr/ | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/local/lib after cleanup:"
sudo du -h --max-depth=1 /usr/local/lib | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /usr/lib after cleanup:"
sudo du -h --max-depth=1 /usr/lib | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /opt after cleanup:"
sudo du -h --max-depth=1 /opt | sort -rh | head -n 10
echo "-------------------------------------------"
echo "Detailed breakdown for /opt/hostedtoolcache after cleanup:"
sudo du -h --max-depth=1 /opt/hostedtoolcache | sort -rh | head -n 10
================================================
FILE: .github/workflows/actions/setup-env/action.yml
================================================
name: "Setup Rust Environment"
description: "Creates a Rust environment with the specified toolchain, cache, and dependencies"
inputs:
cache-key:
description: "Cache key used to retrieve built data. Usually matches the profile of the build"
required: false
default: "cache"
install-deps:
description: "Whether to install system dependencies. Set to false for self-hosted runners with pre-installed deps"
required: false
default: "true"
runs:
using: "composite"
steps:
- name: Set tool versions and cache key
shell: bash
run: |
# Define tool versions in one place
echo "MOLD_VERSION=2.40.4" >> $GITHUB_ENV
echo "LLVM_VERSION=18.1.8" >> $GITHUB_ENV
echo "PROTOC_VERSION=28.3" >> $GITHUB_ENV
echo "LIBPQ_VERSION=18.1-1" >> $GITHUB_ENV
# Create a hash from tool versions for cache key
TOOLS_HASH=$(echo "mold-2.40.4|llvm-18.1.8|protoc-28.3|libpq-18.1-1" | sha256sum | cut -c1-16)
echo "TOOLS_HASH=$TOOLS_HASH" >> $GITHUB_ENV
echo "Tools cache key hash: $TOOLS_HASH"
- name: Set Rust version
shell: bash
run: |
echo "BUILD_RUST_VERSION=$(rustc --version)" >> $GITHUB_ENV
- name: Run sccache-cache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Show sccache stats
shell: bash
run: sccache --show-stats
# Cache specific ~/.local subdirs for locally installed tools (mold, llvm, protoc, libpq)
# Note: We don't cache all of ~/.local to avoid container storage in ~/.local/share
- name: Cache local tools
uses: actions/cache@v4
with:
path: |
~/.local/bin
~/.local/lib
~/.local/include
key: ${{ runner.os }}-local-tools-${{ env.TOOLS_HASH }}
# Set up PATH and env vars for cached tools (must run after cache restore)
- name: Setup paths for cached tools
shell: bash
run: |
# Add ~/.local/bin to PATH for cached tools
echo "$HOME/.local/bin" >> $GITHUB_PATH
export PATH="$HOME/.local/bin:$PATH"
# Setup library paths if ~/.local/lib exists (from cached libpq/llvm)
if [ -d "$HOME/.local/lib" ]; then
echo "LD_LIBRARY_PATH=$HOME/.local/lib:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV
echo "LIBRARY_PATH=$HOME/.local/lib:${LIBRARY_PATH:-}" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig:${PKG_CONFIG_PATH:-}" >> $GITHUB_ENV
echo "LDFLAGS=-L$HOME/.local/lib ${LDFLAGS:-}" >> $GITHUB_ENV
echo "RUSTFLAGS=-L $HOME/.local/lib" >> $GITHUB_ENV
fi
# Setup include paths if ~/.local/include exists
if [ -d "$HOME/.local/include" ]; then
echo "C_INCLUDE_PATH=$HOME/.local/include:${C_INCLUDE_PATH:-}" >> $GITHUB_ENV
echo "CPLUS_INCLUDE_PATH=$HOME/.local/include:${CPLUS_INCLUDE_PATH:-}" >> $GITHUB_ENV
echo "CPPFLAGS=-I$HOME/.local/include ${CPPFLAGS:-}" >> $GITHUB_ENV
fi
# Setup LLVM paths if libclang exists in cache
if [ -d "$HOME/.local/lib" ] && ls $HOME/.local/lib/libclang* &>/dev/null; then
echo "LIBCLANG_PATH=$HOME/.local/lib" >> $GITHUB_ENV
echo "LLVM_CONFIG_PATH=$HOME/.local/bin/llvm-config" >> $GITHUB_ENV
fi
# Export mold path if it exists
if command -v mold &>/dev/null; then
echo "MOLD_PATH=$(which mold)" >> $GITHUB_ENV
fi
- uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
# Install mold - always install locally to avoid sudo requirements
- name: Install mold
shell: bash
run: |
# Check if mold is already available and the right version
if ! command -v mold &> /dev/null || [[ $(mold --version 2>/dev/null | grep -oP '\d+\.\d+\.\d+' | head -1) != "$MOLD_VERSION" ]]; then
echo "Installing mold $MOLD_VERSION in ~/.local"
mkdir -p ~/.local/bin
wget -q -O- "https://github.com/rui314/mold/releases/download/v${MOLD_VERSION}/mold-${MOLD_VERSION}-$(uname -m)-linux.tar.gz" | \
tar -xzf - -C ~/.local --strip-components=1
echo "$HOME/.local/bin" >> $GITHUB_PATH
export PATH="$HOME/.local/bin:$PATH"
else
echo "mold is already installed: $(mold --version)"
fi
# Export the mold path for use in RUSTFLAGS
MOLD_PATH=$(which mold)
echo "MOLD_PATH=${MOLD_PATH}" >> $GITHUB_ENV
echo "Mold installed at: ${MOLD_PATH}"
# Install system dependencies only when install-deps is true
- name: Install system dependencies
if: inputs.install-deps == 'true'
shell: bash
run: sudo apt-get update && sudo apt-get install -y libpq-dev libclang-dev
# Auto-install missing dependencies when install-deps is false (for self-hosted runners)
# Note: PATH and env vars are already set up in "Setup paths for cached tools" step
- name: Setup system dependencies (self-hosted)
if: inputs.install-deps == 'false'
shell: bash
run: |
echo "Checking and installing system dependencies locally if needed..."
# Setup local directories
LOCAL_DIR="$HOME/.local"
LOCAL_BIN="$LOCAL_DIR/bin"
LOCAL_LIB="$LOCAL_DIR/lib"
LOCAL_INCLUDE="$LOCAL_DIR/include"
LOCAL_PKG_CONFIG="$LOCAL_DIR/lib/pkgconfig"
mkdir -p "$LOCAL_BIN" "$LOCAL_LIB" "$LOCAL_INCLUDE" "$LOCAL_PKG_CONFIG"
# Check and install PostgreSQL client libraries if needed
if ! pkg-config --exists libpq 2>/dev/null; then
echo "Installing libpq $LIBPQ_VERSION..."
ARCH=$(dpkg --print-architecture 2>/dev/null || echo "amd64")
WORK_DIR="$LOCAL_DIR/tmp"
mkdir -p "$WORK_DIR" && cd "$WORK_DIR"
# Download PostgreSQL 18 packages
wget -q "https://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-18/libpq5_${LIBPQ_VERSION}.pgdg+2_${ARCH}.deb"
wget -q "https://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-18/libpq-dev_${LIBPQ_VERSION}.pgdg+2_${ARCH}.deb"
# Extract and install
for pkg in *.deb; do
ar p "$pkg" data.tar.xz | tar -xJ --no-same-owner 2>/dev/null || true
done
cp -r usr/lib/*/libpq* usr/lib/libpq* "$LOCAL_LIB/" 2>/dev/null || true
cp -r usr/include/* "$LOCAL_INCLUDE/" 2>/dev/null || true
find usr -name "*.pc" -exec cp {} "$LOCAL_PKG_CONFIG/" \; 2>/dev/null || true
# Fix pkg-config paths
sed -i "s|/usr|$LOCAL_DIR|g" "$LOCAL_PKG_CONFIG"/*.pc 2>/dev/null || true
cd "$HOME" && rm -rf "$WORK_DIR"
echo "✓ libpq installed"
else
echo "✓ libpq found: $(pkg-config --modversion libpq 2>/dev/null || echo 'version unknown')"
fi
# Check and install LLVM/Clang if needed
if ! command -v clang &> /dev/null || ! ls $LOCAL_LIB/libclang* 2>/dev/null && ! ldconfig -p 2>/dev/null | grep -q libclang; then
echo "LLVM/Clang not found, installing locally..."
ARCH=$(uname -m)
# Map architecture names
case "$ARCH" in
x86_64) LLVM_ARCH="x86_64-linux-gnu-ubuntu-22.04" ;;
aarch64) LLVM_ARCH="aarch64-linux-gnu" ;;
*) LLVM_ARCH="$ARCH-linux-gnu" ;;
esac
# Download pre-built LLVM/Clang binaries
echo "Downloading LLVM ${LLVM_VERSION} for ${LLVM_ARCH}..."
wget -q -O- "https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang+llvm-${LLVM_VERSION}-${LLVM_ARCH}.tar.xz" | \
tar -xJf - -C /tmp --strip-components=1 || {
echo "Failed to download pre-built binaries, trying alternative version..."
# Try an older, more widely available version
LLVM_FALLBACK="17.0.6"
wget -q -O- "https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_FALLBACK}/clang+llvm-${LLVM_FALLBACK}-${LLVM_ARCH}.tar.xz" | \
tar -xJf - -C /tmp --strip-components=1
}
# Copy required files
if [ -d "/tmp/bin" ]; then
cp /tmp/bin/clang* "$LOCAL_BIN/" 2>/dev/null || true
cp /tmp/bin/llvm-config "$LOCAL_BIN/" 2>/dev/null || true
cp -r /tmp/lib/libclang* "$LOCAL_LIB/" 2>/dev/null || true
cp -r /tmp/lib/clang "$LOCAL_LIB/" 2>/dev/null || true
cp -r /tmp/include/clang* "$LOCAL_INCLUDE/" 2>/dev/null || true
rm -rf /tmp/bin /tmp/lib /tmp/include /tmp/share
# Set LIBCLANG_PATH for rust bindgen (in case not set by cache)
echo "LIBCLANG_PATH=$LOCAL_LIB" >> $GITHUB_ENV
echo "LLVM_CONFIG_PATH=$LOCAL_BIN/llvm-config" >> $GITHUB_ENV
fi
echo "✓ LLVM/Clang ${LLVM_VERSION} installed locally"
else
echo "✓ clang found: $(clang --version 2>/dev/null | head -n1 || echo 'installed')"
fi
echo "All required system dependencies ready!"
# Install protoc only when install-deps is true
- name: Install Protoc
if: inputs.install-deps == 'true'
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ github.token }}
# Auto-install protoc when install-deps is false (for self-hosted runners)
- name: Setup Protoc (self-hosted)
if: inputs.install-deps == 'false'
shell: bash
run: |
echo "Checking and installing protoc locally if needed..."
if ! command -v protoc &> /dev/null; then
echo "protoc not found, installing locally..."
ARCH=$(uname -m)
# Map architecture names for protoc
case "$ARCH" in
x86_64) PROTOC_ARCH="x86_64" ;;
aarch64) PROTOC_ARCH="aarch_64" ;;
*) PROTOC_ARCH="$ARCH" ;;
esac
# Download and install protoc
mkdir -p ~/.local/bin
wget -q -O /tmp/protoc.zip "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${PROTOC_ARCH}.zip"
unzip -q -o /tmp/protoc.zip -d ~/.local
rm /tmp/protoc.zip
# Make sure it's executable
chmod +x ~/.local/bin/protoc
# Add to PATH if not already there
echo "$HOME/.local/bin" >> $GITHUB_PATH
export PATH="$HOME/.local/bin:$PATH"
echo "✓ protoc ${PROTOC_VERSION} installed locally"
else
PROTOC_VERSION=$(protoc --version | grep -oP '\d+\.\d+(\.\d+)?')
echo "✓ protoc found: version $PROTOC_VERSION"
# Check minimum version (3.0 or higher recommended)
MAJOR_VERSION=$(echo $PROTOC_VERSION | cut -d. -f1)
if [ "$MAJOR_VERSION" -lt 3 ]; then
echo "WARNING: protoc version $PROTOC_VERSION is older than recommended (3.0+)"
fi
fi
echo "Protoc ready!"
================================================
FILE: .github/workflows/enforce-pr-labels.yml
================================================
name: Enforce PR labels
on:
pull_request:
types: [labeled, unlabeled, opened, edited, synchronize]
jobs:
enforce-noteworthiness-label:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: yogevbd/enforce-label-action@2.2.2
with:
REQUIRED_LABELS_ANY: "B0-silent,B5-clientnoteworthy,B7-runtimenoteworthy,B9-contractsnoteworthy"
REQUIRED_LABELS_ALL: ""
BANNED_LABELS: ""
- name: Verify breaking changes label
if: contains(github.event.pull_request.labels.*.name, 'B5-clientnoteworthy') || contains(github.event.pull_request.labels.*.name, 'B7-runtimenoteworthy') || contains(github.event.pull_request.labels.*.name, 'B9-contractsnoteworthy')
uses: yogevbd/enforce-label-action@2.2.2
with:
REQUIRED_LABELS_ANY: "breaking,not-breaking"
REQUIRED_LABELS_ALL: ""
BANNED_LABELS: ""
enforce-auditability-label:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: yogevbd/enforce-label-action@2.2.2
with:
REQUIRED_LABELS_ANY: "D1-audited👍,D5-nicetohaveaudit⚠️,D9-needsaudit👮,D2-notlive,D3-trivial"
REQUIRED_LABELS_ALL: ""
BANNED_LABELS: ""
validate-breaking-description:
runs-on: ubuntu-latest
steps:
- name: Validate PR for "breaking" label and description
env:
PR_BODY: ${{ github.event.pull_request.body }}
PR_LABELS: ${{ toJson(github.event.pull_request.labels) }}
run: |
echo "Pull Request Labels: $PR_LABELS"
echo "Pull Request Body: $PR_BODY"
# Check if "breaking" label is set
if echo "$PR_LABELS" | grep -q '"breaking"'; then
echo "Label 'breaking' is present. Checking description..."
if echo "$PR_BODY" | grep -qi "## ⚠️ Breaking Changes ⚠️"; then
echo "✅ Description contains the required phrase."
else
echo "❌ Description does not contain the required phrase '## ⚠️ Breaking Changes ⚠️'."
exit 1
fi
else
echo "Label 'breaking' is not present. No validation needed."
fi
================================================
FILE: .github/workflows/release.yml
================================================
#! Release workflow for DataHaven Repository
#!
#! This workflow runs when code is merged to main, publishing Docker images
#! to Docker Hub. Validation checks are handled by CI.yml on pull requests.
#!
#! Since PRs require:
#! 1. Branch to be up-to-date with main before merging
#! 2. All CI checks to pass
#! Re-running validation on main would be redundant.
name: Release
on:
workflow_dispatch:
push:
branches:
- main
permissions:
contents: read
packages: write # Required for docker build release jobs
concurrency:
group: release-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
docker-build-release:
uses: ./.github/workflows/task-docker-release.yml
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
validator-set-submitter-docker-build-release:
uses: ./.github/workflows/task-docker-release-validator-set-submitter.yml
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
================================================
FILE: .github/workflows/task-build-operator.yml
================================================
# Build Operator: CI for building the operator binary
name: DataHaven Operator Binary Build
on:
workflow_dispatch:
workflow_call:
outputs:
binary-hash:
description: "The hash of the operator binary"
value: ${{ jobs.build-node.outputs.binary-hash }}
# Explicit minimal permissions
permissions:
contents: read
actions: write # Required for uploading artifacts
jobs:
build-node:
outputs:
binary-hash: ${{ steps.hash-binary.outputs.datahaven-node-hash }}
name: Build operator binary
runs-on:
group: DH-runners
env:
RUSTC_WRAPPER: "sccache"
CARGO_INCREMENTAL: "0"
CARGO_TERM_COLOR: always
SCCACHE_GHA_ENABLED: "true"
defaults:
run:
working-directory: ./operator
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 1
# Re-enable if you get GH issues with the runner being full
# - uses: ./.github/workflows/actions/cleanup-runner
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: BUILD-RELEASE
install-deps: false
- name: Set build flags
run: echo "RUSTFLAGS=${{ env.RUSTFLAGS }} -C linker=clang -C link-arg=-fuse-ld=mold" >> $GITHUB_ENV
- name: Build node binary
run: |
cargo build --release --locked --features fast-runtime
- name: Prepare binary
run: |
mkdir -p ./target/ci
mkdir -p ../build
cp ./target/release/datahaven-node ./target/ci/datahaven-node
cp ./target/release/datahaven-node ../build/datahaven-node
- name: Hash binary
id: hash-binary
run: |
TIMESTAMP=$(date +%s)
BINARY_PATH=./target/ci/datahaven-node
HASH=$(echo "$TIMESTAMP" | cat - $BINARY_PATH | sha256sum | awk '{ print $1 }')
echo "datahaven-node-hash=$HASH" >> $GITHUB_OUTPUT
echo "Hash of the datahaven-node is: $HASH (with timestamp: $TIMESTAMP)"
- name: Upload binary to workflow
uses: actions/upload-artifact@v4
with:
name: datahaven-node-${{ steps.hash-binary.outputs.datahaven-node-hash }}
path: build/datahaven-node
retention-days: 1
- name: Upload WASM to workflow
uses: actions/upload-artifact@v4
with:
name: datahaven-wasm-${{ steps.hash-binary.outputs.datahaven-node-hash }}
path: operator/target/release/wbuild/datahaven-stagenet-runtime/datahaven_stagenet_runtime.wasm
retention-days: 1
- name: Build Stats
run: |
sccache --show-stats
echo "Binary size: $(du -h ./target/ci/datahaven-node | cut -f1)"
================================================
FILE: .github/workflows/task-build-static-operator.yaml
================================================
name: DataHaven Operator Static Build
on:
pull_request:
paths:
# Only check the build if we are adding a dependency to save runner time
- 'operator/Cargo.toml'
- 'operator/Cargo.lock'
jobs:
build-node:
name: Build operator binary
runs-on:
group: DH-runners
env:
RUSTC_WRAPPER: "sccache"
CARGO_INCREMENTAL: "0"
CARGO_TERM_COLOR: always
SCCACHE_GHA_ENABLED: "true"
defaults:
run:
working-directory: ./operator
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 1
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: BUILD-RELEASE
install-deps: false
skip-libpq: true
- name: Set build flags
run: echo "RUSTFLAGS=-C linker=clang -C link-arg=-fuse-ld=mold" >> $GITHUB_ENV
- name: Build node binary
run: |
cargo build --release --locked --features fast-runtime,static
- name: Test binary
run: |
ldd ./target/release/datahaven-node
./target/release/datahaven-node --version
================================================
FILE: .github/workflows/task-check-licenses.yml
================================================
name: Check licenses
on:
pull_request:
workflow_dispatch:
jobs:
verify:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v5
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: 1.88.0
override: true
- name: Verify Licenses
working-directory: operator
run: |
cargo install cargo-license@0.7.0
./scripts/verify-licenses.sh
================================================
FILE: .github/workflows/task-check-metadata.yml
================================================
name: "Task: Check Metadata Freshness"
on:
workflow_dispatch:
inputs:
binary-hash:
description: "Hash of the binary artifact to use"
required: true
type: string
workflow_call:
inputs:
binary-hash:
description: "Hash of the binary artifact to use"
required: true
type: string
# Explicit minimal permissions
permissions:
contents: read
defaults:
run:
shell: bash
env:
RUST_BACKTRACE: "1"
jobs:
check-metadata:
name: Check metadata freshness
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- name: Install dependencies
working-directory: test
run: bun install --frozen-lockfile
- name: Download WASM artifact
uses: actions/download-artifact@v4
with:
name: datahaven-wasm-${{ inputs.binary-hash }}
path: ./operator/target/release/wbuild/datahaven-stagenet-runtime
- name: Verify WASM download to target directory
run: |
echo "Target directory contents:"
find ./operator/target/release/wbuild/datahaven-stagenet-runtime -type f | head -20
# The WASM should be at this path in the artifact
WASM_PATH="./operator/target/release/wbuild/datahaven-stagenet-runtime/datahaven_stagenet_runtime.wasm"
if [ ! -f "$WASM_PATH" ]; then
echo "Error: WASM file not found at expected path: $WASM_PATH"
echo "Looking for WASM files in target directory:"
find ./operator/target/release/wbuild/datahaven-stagenet-runtime -name "*.wasm" -type f
exit 1
fi
echo "Found WASM at: $WASM_PATH"
echo "WASM size: $(du -h $WASM_PATH | cut -f1)"
- name: Generate metadata from WASM
working-directory: test
run: |
echo "Generating metadata from WASM..."
bun x papi add --wasm "../operator/target/release/wbuild/datahaven-stagenet-runtime/datahaven_stagenet_runtime.wasm" datahaven
- name: Check for metadata changes
run: |
# Check if the metadata file has changed
if git diff --exit-code test/.papi/metadata/datahaven.scale; then
echo "✅ Metadata is up to date!"
else
echo "❌ Metadata file has changed!"
echo ""
echo "The runtime metadata is out of date. Please run the following command and commit the changes:"
echo ""
echo " cd test && bun generate:types:fast"
echo ""
echo "This ensures that TypeScript types match the current runtime."
echo ""
echo "Diff of changes:"
git diff test/.papi/metadata/datahaven.scale | head -50
exit 1
fi
- name: Check for other papi changes
run: |
# Also check if polkadot-api.json changed (shouldn't happen, but good to verify)
if git diff --exit-code test/.papi/polkadot-api.json; then
echo "✅ polkadot-api.json is unchanged"
else
echo "⚠️ polkadot-api.json has changed - this is unexpected"
git diff test/.papi/polkadot-api.json
fi
================================================
FILE: .github/workflows/task-docker-ci.yml
================================================
name: Docker Build & Publish (CI)
on:
workflow_dispatch:
inputs:
binary-hash:
description: "The hash of the operator binary"
required: false
type: string
workflow_call:
inputs:
binary-hash:
description: "The hash of the operator binary"
required: true
type: string
outputs:
image-tag:
description: "The tag portion of the docker image (without registry)"
value: "${{ jobs.build-test-push.outputs.image-tag }}"
permissions:
contents: read
packages: write
concurrency:
group: docker-build-ci-${{ github.ref }}
cancel-in-progress: true
jobs:
build-test-push:
runs-on: ubuntu-latest
outputs:
image-tag: ${{ steps.extract_tag.outputs.image-tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download binary artifact
uses: actions/download-artifact@v4
with:
name: datahaven-node-${{ inputs.binary-hash }}
path: ./build/
- name: Prepare binary
run: |
chmod +x ./build/datahaven-node
ls -la ./build/
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/datahaven-xyz/datahaven/datahaven
flavor: |
latest=auto
tags: |
type=raw,value=ci-${{ github.run_id }}
type=sha,format=short,prefix=sha-
type=ref,event=tag
type=ref,event=branch
type=ref,event=pr
- name: Extract tag for job output
id: extract_tag
run: |
FULL_TAG=$(echo '${{ steps.meta.outputs.json }}' | jq -r '.tags[-1]')
TAG_ONLY=$(echo "$FULL_TAG" | sed 's|.*:||')
echo "image-tag=$TAG_ONLY" >> $GITHUB_OUTPUT
echo "image-name=ghcr.io/datahaven-xyz/datahaven/datahaven:$TAG_ONLY" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: ./.github/workflow-templates/publish-docker
with:
dockerfile: ./operator/Dockerfile
context: .
registry: ghcr.io
registry_username: ${{ github.actor }}
registry_password: ${{ secrets.GITHUB_TOKEN }}
image_tags: ${{ steps.meta.outputs.tags }}
image_title: "DataHaven Node - CI"
image_description: "CI build of DataHaven operator node"
cache_scope: datahaven-ci-build
# --- Smoke tests ---
- name: Pull and test node --help
run: |
docker pull ${{ steps.extract_tag.outputs.image-name }}
docker run --rm ${{ steps.extract_tag.outputs.image-name }} --help
- name: Integration test (dev chain starts)
run: |
docker run --rm -d -p 9944:9944 --name local-dh-node \
${{ steps.extract_tag.outputs.image-name }} --dev --unsafe-rpc-external
- name: Wait for node to be healthy and test
run: |
echo "Waiting for node to start..."
for i in {1..30}; do # Retry for 30 * 5s = 150 seconds
if curl --fail --location 'http://127.0.0.1:9944' \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"system_chain","params":[]}' ; then
echo "Node is healthy!"
docker logs local-dh-node --tail 100
exit 0
fi
echo "Attempt $i: Node not ready yet, sleeping 5s..."
sleep 5
done
echo "Node failed to start or respond in time."
docker logs local-dh-node --tail 100
exit 1
- name: Cleanup integration test container
if: always()
run: docker rm -f local-dh-node
================================================
FILE: .github/workflows/task-docker-release-validator-set-submitter.yml
================================================
name: Docker Build & Publish Validator Set Submitter (Release)
on:
workflow_dispatch:
inputs:
label:
description: "Label for the Docker image"
required: true
type: string
branch:
description: "Branch to checkout and build"
required: true
type: string
workflow_call:
secrets:
DOCKERHUB_USERNAME:
description: "Docker Hub username"
required: true
DOCKERHUB_TOKEN:
description: "Docker Hub access token"
required: true
outputs:
image-tag:
description: "The tag portion of the docker image (without registry)"
value: "${{ jobs.build-test-push.outputs.image-tag }}"
permissions:
contents: read
packages: write
concurrency:
group: docker-build-release-validator-set-submitter-${{ github.ref }}
cancel-in-progress: true
jobs:
build-test-push:
runs-on: ubuntu-latest
# Require approval before publishing to Docker Hub
environment: production
outputs:
image-tag: ${{ steps.extract_tag.outputs.image-tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.branch || github.ref }}
- uses: ./.github/workflows/actions/cleanup-runner
# --- Docker metadata ---
- name: Docker meta (dispatch)
if: github.event_name == 'workflow_dispatch'
id: meta-dispatch
uses: docker/metadata-action@v5
with:
images: datahavenxyz/validator-set-submitter
flavor: |
latest=false
tags: |
type=raw,value=${{ github.event.inputs.label }}
- name: Docker meta (CI - main push)
if: github.event_name != 'workflow_dispatch'
id: meta-ci
uses: docker/metadata-action@v5
with:
images: datahavenxyz/validator-set-submitter
flavor: |
latest=true
tags: |
type=raw,value=latest
type=sha,format=short,prefix=sha-
- name: Extract tag for job output
id: extract_tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
FULL_TAG=$(echo '${{ steps.meta-dispatch.outputs.json }}' | jq -r '.tags[-1]')
else
FULL_TAG=$(echo '${{ steps.meta-ci.outputs.json }}' | jq -r '.tags[-1]')
fi
TAG_ONLY=$(echo "$FULL_TAG" | sed 's|.*:||')
echo "image-tag=$TAG_ONLY" >> $GITHUB_OUTPUT
echo "image-name=datahavenxyz/validator-set-submitter:$TAG_ONLY" >> $GITHUB_OUTPUT
# --- Build and push Docker image ---
- name: Build and push Docker image
uses: ./.github/workflow-templates/publish-docker
with:
dockerfile: ./test/tools/validator-set-submitter/Dockerfile
context: ./test
registry: docker.io
registry_username: ${{ secrets.DOCKERHUB_USERNAME }}
registry_password: ${{ secrets.DOCKERHUB_TOKEN }}
image_tags: ${{ steps.meta-dispatch.outputs.tags || steps.meta-ci.outputs.tags }}
image_title: "Validator Set Submitter - Release"
image_description: "Release build of DataHaven validator set submitter"
cache_scope: validator-set-submitter-release-build
# --- Smoke tests ---
- name: Pull and test submitter --help
run: |
docker pull ${{ steps.extract_tag.outputs.image-name }}
docker run --rm ${{ steps.extract_tag.outputs.image-name }} --help
================================================
FILE: .github/workflows/task-docker-release.yml
================================================
name: Docker Build & Publish (Release)
on:
workflow_dispatch:
inputs:
label:
description: "Label for the Docker image"
required: true
type: string
branch:
description: "Branch to checkout and build"
required: true
type: string
fast_runtime:
description: "Enable fast runtime features"
required: false
type: boolean
default: false
workflow_call:
secrets:
DOCKERHUB_USERNAME:
description: "Docker Hub username"
required: true
DOCKERHUB_TOKEN:
description: "Docker Hub access token"
required: true
outputs:
image-tag:
description: "The tag portion of the docker image (without registry)"
value: "${{ jobs.build-test-push.outputs.image-tag }}"
permissions:
contents: read
packages: write
concurrency:
group: docker-build-release-${{ github.ref }}
cancel-in-progress: true
jobs:
build-test-push:
runs-on: ubuntu-latest
# Require approval before publishing to Docker Hub
environment: production
outputs:
image-tag: ${{ steps.extract_tag.outputs.image-tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.branch || github.ref }}
- uses: ./.github/workflows/actions/cleanup-runner
# --- Docker metadata ---
- name: Docker meta (dispatch)
if: github.event_name == 'workflow_dispatch'
id: meta-dispatch
uses: docker/metadata-action@v5
with:
images: datahavenxyz/datahaven
flavor: |
latest=false
tags: |
type=raw,value=${{ github.event.inputs.label }}
- name: Docker meta (CI - main push)
if: github.event_name != 'workflow_dispatch'
id: meta-ci
uses: docker/metadata-action@v5
with:
images: datahavenxyz/datahaven
flavor: |
latest=true
tags: |
type=raw,value=latest
type=sha,format=short,prefix=sha-
- name: Extract tag for job output
id: extract_tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
FULL_TAG=$(echo '${{ steps.meta-dispatch.outputs.json }}' | jq -r '.tags[-1]')
else
FULL_TAG=$(echo '${{ steps.meta-ci.outputs.json }}' | jq -r '.tags[-1]')
fi
TAG_ONLY=$(echo "$FULL_TAG" | sed 's|.*:||')
echo "image-tag=$TAG_ONLY" >> $GITHUB_OUTPUT
echo "image-name=datahavenxyz/datahaven:$TAG_ONLY" >> $GITHUB_OUTPUT
# --- Cargo cache for full builds ---
- name: Set up cargo cache
uses: actions/cache@v4
id: cache
with:
path: |
**/cargo-registry
**/cargo-git
key: cache-mount-${{ hashFiles('./docker/datahaven-build.Dockerfile') }}-${{ hashFiles('./operator/Cargo.lock') }}-${{hashFiles('./operator/runtime/**/*.rs','./operator/pallets/**/*.rs', './operator/node/**/*.rs')}}
restore-keys: |
cache-mount-${{ hashFiles('./docker/datahaven-build.Dockerfile') }}-${{ hashFiles('./operator/Cargo.lock') }}
cache-mount-${{ hashFiles('./docker/datahaven-build.Dockerfile') }}
cache-mount-
- name: Inject cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
with:
cache-map: |
{
"cargo-registry": { "target": "/usr/local/cargo/registry" },
"cargo-git": { "target": "/usr/local/cargo/git" }
}
skip-extraction: ${{ steps.cache.outputs.cache-hit }}
# --- Build and push Docker image ---
- name: Build and push Docker image
uses: ./.github/workflow-templates/publish-docker
with:
dockerfile: ./docker/datahaven-build.Dockerfile
context: ./operator
registry: docker.io
registry_username: ${{ secrets.DOCKERHUB_USERNAME }}
registry_password: ${{ secrets.DOCKERHUB_TOKEN }}
image_tags: ${{ steps.meta-dispatch.outputs.tags || steps.meta-ci.outputs.tags }}
image_title: "DataHaven Node - Release"
image_description: "Release build of DataHaven blockchain node"
cache_scope: datahaven-release-build
build_args: |
FAST_RUNTIME=${{ github.event.inputs.fast_runtime == 'true' && 'TRUE' || 'FALSE' }}
# --- Smoke tests ---
- name: Pull and test node --help
run: |
docker pull ${{ steps.extract_tag.outputs.image-name }}
docker run --rm ${{ steps.extract_tag.outputs.image-name }} --help
- name: Integration test (dev chain starts)
run: |
docker run --rm -d -p 9944:9944 --name local-dh-node \
${{ steps.extract_tag.outputs.image-name }} --dev --unsafe-rpc-external
- name: Wait for node to be healthy and test
run: |
echo "Waiting for node to start..."
for i in {1..30}; do # Retry for 30 * 5s = 150 seconds
if curl --fail --location 'http://127.0.0.1:9944' \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"system_chain","params":[]}' ; then
echo "Node is healthy!"
docker logs local-dh-node --tail 100
exit 0
fi
echo "Attempt $i: Node not ready yet, sleeping 5s..."
sleep 5
done
echo "Node failed to start or respond in time."
docker logs local-dh-node --tail 100
exit 1
- name: Cleanup integration test container
if: always()
run: docker rm -f local-dh-node
================================================
FILE: .github/workflows/task-e2e.yml
================================================
# End-To-End Tests: CI for starting a full ETH private network, deploying AVS and running tests.
#
# Overview:
# 1. Start kurtosis network
# 2. Deploy AVS contracts
# 3. Start DataHaven node
# 4. Run E2E tests
name: E2E - Kurtosis Deploy and Verify
on:
workflow_dispatch:
inputs:
image-tag:
description: "The tag of the docker image"
required: true
type: string
workflow_call:
inputs:
image-tag:
description: "The tag of the docker image"
required: true
type: string
secrets:
DOCKERHUB_USERNAME:
required: false
DOCKERHUB_TOKEN:
required: false
permissions:
contents: read
packages: read
env:
FOUNDRY_PROFILE: ci
LOG_LEVEL: debug
DOCKER_HOST: unix:///run/user/1020/podman/podman.sock
KURTOSIS_CORE_IMAGE: docker.io/kurtosistech/core
KURTOSIS_ENGINE_IMAGE: docker.io/kurtosistech/engine
KURTOSIS_VERSION: 1.15.2
INJECT_CONTRACTS: false
jobs:
kurtosis:
runs-on:
group: DH-Testing
name: E2E Tests with Kurtosis Ethereum Network
defaults:
run:
working-directory: test
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- name: Check for outdated state-diff.json
run: bun ./scripts/check-generated-state.ts
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: v1.4.3
- name: Pull Kurtosis images
run: |
docker pull ${{ env.KURTOSIS_CORE_IMAGE }}:${{ env.KURTOSIS_VERSION }}
docker pull ${{ env.KURTOSIS_ENGINE_IMAGE }}:${{ env.KURTOSIS_VERSION }}
- name: Install Kurtosis
run: |
# Install Kurtosis locally without sudo
# SHA256 checksum for release kurtosis binary (v1.15.2)
KURTOSIS_SHA256="5da4731180f60021bbb1d313e1d2994b7d0fcdeae1a2f2081c620cf51a265463"
if ! command -v kurtosis &> /dev/null; then
echo "Installing Kurtosis $KURTOSIS_VERSION locally"
mkdir -p ~/.local/bin
wget -q -O kurtosis-cli.tar.gz "https://github.com/kurtosis-tech/kurtosis-cli-release-artifacts/releases/download/${KURTOSIS_VERSION}/kurtosis-cli_${KURTOSIS_VERSION}_linux_amd64.tar.gz"
tar -xzf kurtosis-cli.tar.gz -C ~/.local/bin
rm kurtosis-cli.tar.gz
# Verify checksum before making executable
echo "Verifying kurtosis checksum..."
echo "${KURTOSIS_SHA256} $HOME/.local/bin/kurtosis" | sha256sum -c -
chmod +x ~/.local/bin/kurtosis
echo "$HOME/.local/bin" >> $GITHUB_PATH
export PATH="$HOME/.local/bin:$PATH"
else
echo "Kurtosis is already installed: $(kurtosis version)"
fi
kurtosis analytics disable
kurtosis version
- name: Configure Kurtosis cluster = podman
run: |
# Get the config path from Kurtosis itself (portable)
CFG_PATH="$(kurtosis config path)"
mkdir -p "$(dirname "$CFG_PATH")"
# Create/update config with a podman cluster entry
cat > "$CFG_PATH" <<'YML'
config-version: 6
should-send-metrics: true
kurtosis-clusters:
docker:
type: "docker"
podman:
type: "podman"
YML
kurtosis cluster set podman
kurtosis cluster get
- name: Start Kurtosis engine with Podman
run: |
kurtosis engine stop
kurtosis clean
kurtosis engine start
kurtosis engine status
- uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to Docker Hub
if: github.repository == 'datahaven-xyz/datahaven'
uses: docker/login-action@v3
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Download Snowbridge relay binary
run: |
docker create --name temp datahavenxyz/snowbridge-relay:latest
mkdir -p tmp/bin
docker cp temp:/usr/local/bin/snowbridge-relay tmp/bin/
chmod +x tmp/bin/snowbridge-relay
docker rm -fv temp
tmp/bin/snowbridge-relay --help
- name: Pull DataHaven node image
run: |
docker pull ghcr.io/datahaven-xyz/datahaven/datahaven:${{ inputs.image-tag }}
docker tag ghcr.io/datahaven-xyz/datahaven/datahaven:${{ inputs.image-tag }} datahavenxyz/datahaven:local
- run: bun install
- name: Run E2E tests
run: bun test:e2e
- name: Delete volumes not used
if: always()
run: podman system prune --volumes -f
================================================
FILE: .github/workflows/task-foundry-tests.yml
================================================
# Foundry Tests: CI for Foundry components (smart contracts for EigenLayer and Snowbridge interaction)
#
# Overview:
# 1. All Foundry Tests: Executes the full suite of Foundry tests found within the `./contracts` directory
name: Foundry AVS Smart Contract Tests
on:
workflow_dispatch:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
env:
FOUNDRY_PROFILE: ci
jobs:
test:
strategy:
fail-fast: false
matrix:
partition: [1]
name: Foundry Tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: contracts
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: v1.4.3
- run: forge --version
- run: forge fmt --check
- run: forge build --sizes
- run: forge test -vvv
================================================
FILE: .github/workflows/task-moonwall-tests.yml
================================================
name: Moonwall Tests
on:
workflow_dispatch:
workflow_call:
inputs:
binary-hash:
description: "Hash of the built operator binary uploaded as artifact"
required: true
type: string
# Explicit minimal permissions
permissions:
contents: read
actions: write # Required for uploading artifacts
jobs:
moonwall:
runs-on: ubuntu-latest
defaults:
run:
working-directory: test
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Download operator binary artifact
uses: actions/download-artifact@v4
with:
name: datahaven-node-${{ inputs.binary-hash }}
path: operator/target/x86_64-unknown-linux-gnu/release
- name: Prepare operator binary in expected path
run: |
mkdir -p ../operator/target/release
cp ../operator/target/x86_64-unknown-linux-gnu/release/datahaven-node ../operator/target/release/datahaven-node
chmod +x ../operator/target/release/datahaven-node
timeout 20 ../operator/target/release/datahaven-node \
--dev \
--no-telemetry \
--unsafe-force-node-key-generation \
--reserved-only \
--no-grandpa \
--no-prometheus \
--sealing=manual 2>&1 | head -50 || echo "Node startup test completed"
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
- name: Run Moonwall tests
run: bun run moonwall:test
- name: Upload Moonwall reports
if: always()
uses: actions/upload-artifact@v4
with:
name: moonwall-reports
path: |
test/tmp/testResults.json
test/reports/**
test/**/*.log
retention-days: 1
================================================
FILE: .github/workflows/task-publish-binary.yml
================================================
name: Publish Binary Draft
# The code (like generate-release-body) will be taken from the tag version, not master
on:
workflow_dispatch:
inputs:
from:
description: tag (ex. v0.1.0) to retrieve commit diff from
required: true
to:
description: tag (ex. v0.2.0) to generate release note and binaries from
required: true
jobs:
prepare-sources:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write # Required for uploading artifacts
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
fetch-depth: 0
- name: Upload sources as artifact
uses: actions/upload-artifact@v4
with:
name: datahaven-sources
path: .
retention-days: 1
build-binary:
runs-on:
group: DH-runners
needs: ["prepare-sources"]
permissions:
contents: read
actions: write # Required for uploading artifacts
strategy:
matrix:
cpu: ["x86-64", "skylake", "znver3"]
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
- name: Cargo build
uses: ./.github/workflow-templates/build-prod-binary
with:
target: ${{ matrix.cpu }}
####### Prepare and publish the release draft #######
publish-draft-release:
runs-on: ubuntu-latest
# Require approval before creating release drafts
environment: releases
permissions:
contents: write
needs: ["build-binary"]
outputs:
release_url: ${{ steps.create-release.outputs.html_url }}
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
fetch-depth: 0
- uses: actions/download-artifact@v5
with:
pattern: datahaven-binaries-*
merge-multiple: true
path: build
- name: Use Node.js
uses: actions/setup-node@v5
with:
node-version-file: "tools/.nvmrc"
- name: Prepare DataHaven binary for release body generation
working-directory: build
run: |
mv datahaven-node-x86-64 datahaven-node
- name: Generate release body
id: generate-release-body
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
working-directory: tools
run: |
yarn
yarn -s run ts-node github/generate-release-body.ts --owner "${{ github.repository_owner }}" --repo "$(basename ${{ github.repository }})" --from "${{ github.event.inputs.from }}" --to "${{ github.event.inputs.to }}" --srtool-report-folder '../build/' > ../body.md
- name: Prepare binary assets
working-directory: build
run: |
# Prepare binaries for upload
cp datahaven-node ../datahaven-node
cp datahaven-node-skylake ../datahaven-node-skylake
cp datahaven-node-znver3 ../datahaven-node-znver3
- name: Create draft release with binaries
id: create-release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.to }}
name: DataHaven ${{ github.event.inputs.to }}
body_path: body.md
draft: true
files: |
datahaven-node
datahaven-node-skylake
datahaven-node-znver3
####### Publish Release Candidate Docker Image #######
docker-release-candidate:
runs-on: ubuntu-latest
# Require approval before publishing RC images to Docker Hub
environment: production
needs: ["build-binary"]
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
- uses: actions/download-artifact@v5
with:
pattern: datahaven-binaries-*
merge-multiple: true
path: build
- name: Rename binary for Docker
working-directory: build
run: |
mv datahaven-node-x86-64 datahaven-node
- name: Prepare Docker metadata
id: prep
run: |
DOCKER_IMAGE=datahavenxyz/datahaven
VERSION="${{ github.event.inputs.to }}"
TAG="${VERSION}-rc"
echo "tags=${DOCKER_IMAGE}:${TAG}" >> $GITHUB_OUTPUT
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
- name: Cargo build
uses: ./.github/workflow-templates/publish-docker
with:
dockerfile: ./operator/Dockerfile
context: .
registry: docker.io
registry_username: ${{ secrets.DOCKERHUB_USERNAME }}
registry_password: ${{ secrets.DOCKERHUB_TOKEN }}
image_tags: ${{ steps.prep.outputs.tags }}
image_title: ${{ github.event.repository.name }}
image_description: ${{ github.event.repository.description }}
image_url: ${{ github.event.repository.html_url }}
image_source: ${{ github.event.repository.clone_url }}
image_created: ${{ steps.prep.outputs.created }}
image_revision: ${{ github.sha }}
image_licenses: ${{ github.event.repository.license.spdx_id }}
================================================
FILE: .github/workflows/task-publish-runtime.yml
================================================
name: Publish Runtime Draft
# The code (like generate-release-body) will be taken from the tag versions, not master
on:
workflow_dispatch:
inputs:
from:
description: tag (ex. runtime-53) to retrieve commit diff from
required: true
to:
description: tag (ex. runtime-155) to generate release note and srtool runtimes from
required: true
jobs:
####### Build runtimes with srtool #######
setup-scripts:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write # Required for uploading artifacts
steps:
- uses: actions/checkout@v5
- name: Upload scripts
uses: actions/upload-artifact@v4
with:
name: original-scripts
path: operator/scripts
- name: Upload tools
uses: actions/upload-artifact@v4
with:
name: original-tools
path: tools
read-rust-version:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
rust_version: ${{ steps.get-version.outputs.rust_version }}
steps:
- uses: actions/checkout@v5
- id: get-version
run: |
RUST_VERSION=$(cat operator/rust-toolchain.toml | grep channel | grep --only-matching --perl-regexp "\d+\.\d+(?:\.\d+)?(?:-nightly)?")
echo "rust_version=$RUST_VERSION" >> $GITHUB_OUTPUT
build-srtool-runtimes:
needs: ["setup-scripts", "read-rust-version"]
runs-on: ubuntu-latest
permissions:
contents: read
actions: write # Required for uploading artifacts
strategy:
matrix:
chain: ["stagenet", "testnet", "mainnet"]
srtool_image:
- paritytech/srtool
srtool_image_tag:
- ${{ needs.read-rust-version.outputs.rust_version }}
steps:
- uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
- name: Login to DockerHub
uses: docker/login-action@v3
if: github.repository == 'datahaven-xyz/datahaven'
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
registry: index.docker.io
- name: Download original scripts
uses: actions/download-artifact@v5
with:
name: original-scripts
path: original-scripts
- name: Build runtime using "${{ matrix.srtool_image }}:${{ matrix.srtool_image_tag }}"
id: srtool_build
env:
GH_WORKFLOW_MATRIX_CHAIN: ${{ matrix.chain }}
GH_WORKFLOW_MATRIX_SRTOOL_IMAGE: ${{ matrix.srtool_image }}
GH_WORKFLOW_MATRIX_SRTOOL_IMAGE_TAG: ${{ matrix.srtool_image_tag }}
RUNTIME_BUILD_OPTS: "--features=on-chain-release-build"
RUNTIME_BUILD_PROFILE: "production"
IS_PODMAN: true
run: |
# Ensure we have permissions to write to the runtime folder target for the container user
mkdir -p operator/runtime/${GH_WORKFLOW_MATRIX_CHAIN}/target
chmod uog+rwX operator/runtime/${GH_WORKFLOW_MATRIX_CHAIN}/target
chmod u+x ./original-scripts/build-runtime-srtool.sh
./original-scripts/build-runtime-srtool.sh
- name: Summary
run: |
echo '${{ steps.srtool_build.outputs.json }}' | jq . > ${{ matrix.chain }}-srtool-digest.json
cat ${{ matrix.chain }}-srtool-digest.json
cp ${{ steps.srtool_build.outputs.wasm_compressed }} ${{ matrix.chain }}-runtime.compact.compressed.wasm
- name: Archive Artifacts for ${{ matrix.chain }}
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.chain }}-runtime
path: |
${{ matrix.chain }}-runtime.compact.compressed.wasm
${{ matrix.chain }}-srtool-digest.json
####### Prepare the release draft #######
publish-draft-release:
runs-on: ubuntu-latest
# Require approval before creating release drafts
environment: releases
permissions:
contents: write
needs: ["setup-scripts", "build-srtool-runtimes"]
outputs:
release_url: ${{ steps.create-release.outputs.html_url }}
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.to }}
fetch-depth: 0
- name: Download stagenet runtime
uses: actions/download-artifact@v5
with:
name: stagenet-runtime
path: build
- name: Download testnet runtime
uses: actions/download-artifact@v5
with:
name: testnet-runtime
path: build
- name: Download mainnet runtime
uses: actions/download-artifact@v5
with:
name: mainnet-runtime
path: build
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version-file: "test/.nvmrc"
- name: Download Original Tools
uses: actions/download-artifact@v5
with:
name: original-tools
path: original-tools
- name: Generate release body
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: generate-release-body
working-directory: original-tools
run: |
yarn
yarn -s run ts-node github/generate-runtimes-body.ts --owner "${{ github.repository_owner }}" --repo "$(basename ${{ github.repository }})" --from "${{ github.event.inputs.from }}" --to "${{ github.event.inputs.to }}" --srtool-report-folder '../build/' > ../body.md
- name: Get runtime versions
id: get-runtime-ver
run: |
runtime_stagenet_ver="$(cat ./operator/runtime/stagenet/src/lib.rs | grep -o 'spec_version: [0-9]*' | tail -1 | grep -o '[0-9]*')"
echo "runtime_stagenet_ver=$runtime_stagenet_ver" >> $GITHUB_OUTPUT
runtime_testnet_ver="$(cat ./operator/runtime/testnet/src/lib.rs | grep -o 'spec_version: [0-9]*' | tail -1 | grep -o '[0-9]*')"
echo "runtime_testnet_ver=$runtime_testnet_ver" >> $GITHUB_OUTPUT
runtime_mainnet_ver="$(cat ./operator/runtime/mainnet/src/lib.rs | grep -o 'spec_version: [0-9]*' | tail -1 | grep -o '[0-9]*')"
echo "runtime_mainnet_ver=$runtime_mainnet_ver" >> $GITHUB_OUTPUT
- name: Prepare runtime assets
working-directory: build
run: |
# Get runtime versions from the previous step
runtime_stagenet_ver="${{ steps.get-runtime-ver.outputs.runtime_stagenet_ver }}"
runtime_testnet_ver="${{ steps.get-runtime-ver.outputs.runtime_testnet_ver }}"
runtime_mainnet_ver="${{ steps.get-runtime-ver.outputs.runtime_mainnet_ver }}"
# Rename files with version numbers
mv stagenet-runtime.compact.compressed.wasm ../stagenet-runtime-${runtime_stagenet_ver}.wasm
mv stagenet-srtool-digest.json ../stagenet-runtime-${runtime_stagenet_ver}.srtool-digest.json
mv testnet-runtime.compact.compressed.wasm ../testnet-runtime-${runtime_testnet_ver}.wasm
mv testnet-srtool-digest.json ../testnet-runtime-${runtime_testnet_ver}.srtool-digest.json
mv mainnet-runtime.compact.compressed.wasm ../mainnet-runtime-${runtime_mainnet_ver}.wasm
mv mainnet-srtool-digest.json ../mainnet-runtime-${runtime_mainnet_ver}.srtool-digest.json
- name: Create draft release with runtime assets
id: create-release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.to }}
name: Runtime ${{ github.event.inputs.to }}
body_path: body.md
draft: true
files: |
stagenet-runtime-${{ steps.get-runtime-ver.outputs.runtime_stagenet_ver }}.wasm
stagenet-runtime-${{ steps.get-runtime-ver.outputs.runtime_stagenet_ver }}.srtool-digest.json
testnet-runtime-${{ steps.get-runtime-ver.outputs.runtime_testnet_ver }}.wasm
testnet-runtime-${{ steps.get-runtime-ver.outputs.runtime_testnet_ver }}.srtool-digest.json
mainnet-runtime-${{ steps.get-runtime-ver.outputs.runtime_mainnet_ver }}.wasm
mainnet-runtime-${{ steps.get-runtime-ver.outputs.runtime_mainnet_ver }}.srtool-digest.json
================================================
FILE: .github/workflows/task-rust-lint.yml
================================================
# Lint and Format: CI for Rust components (DataHaven runtime and node Rust tests)
#
# Overview:
# 1. Check Rust Format: Check that the Rust code is formatted correctly
# 2. Check Rust Lint: Check that the Rust code is linted correctly
name: Lint and Format
on:
workflow_call:
workflow_dispatch:
inputs:
pull_request:
description: set to pull_request number to execute on external pr
required: false
# Explicit minimal permissions
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
WORKING_DIR: operator
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
jobs:
cargo-fmt:
name: "Check format with rustfmt"
runs-on:
group: DH-runners
defaults:
run:
working-directory: ${{ env.WORKING_DIR }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: FMT
install-deps: false # Self-hosted runners have deps pre-installed
- name: Run cargo fmt
run: cargo fmt --all -- --check
check-rust-lint:
name: "Check lint with clippy"
runs-on:
group: DH-runners
defaults:
run:
working-directory: ${{ env.WORKING_DIR }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: LINT
install-deps: false # Self-hosted runners have deps pre-installed
- name: Set build flags
run: echo "RUSTFLAGS=${{ env.RUSTFLAGS }} -C linker=clang -C link-arg=-fuse-ld=mold" >> $GITHUB_ENV
- name: Run cargo clippy
run: SKIP_WASM_BUILD=1 cargo clippy --features try-runtime,runtime-benchmarks --locked --release
check-cargo-sort:
name: "Check Cargo sort"
runs-on:
group: DH-runners
defaults:
run:
working-directory: ${{ env.WORKING_DIR }}
steps:
- name: Check out the repository to the runner
uses: actions/checkout@v4
- name: Install taplo locally
run: |
# Install taplo in user space without sudo
TAPLO_VERSION="0.8.1"
# SHA256 checksum for taplo-full-linux-x86_64.gz (decompressed binary)
TAPLO_SHA256="c62baa73c9d7c1572047b1a502ca805e1372e5db7c9a935532f702f12d6115ce"
if ! command -v taplo &> /dev/null || [[ $(taplo --version | grep -oP '\d+\.\d+\.\d+' | head -1) != "$TAPLO_VERSION" ]]; then
echo "Installing taplo $TAPLO_VERSION in ~/.local/bin"
mkdir -p ~/.local/bin
curl -Ls "https://github.com/tamasfe/taplo/releases/download/${TAPLO_VERSION}/taplo-full-linux-x86_64.gz" | \
gzip -d > ~/.local/bin/taplo
# Verify checksum before making executable
echo "Verifying taplo checksum..."
echo "${TAPLO_SHA256} $HOME/.local/bin/taplo" | sha256sum -c -
chmod +x ~/.local/bin/taplo
echo "$HOME/.local/bin" >> $GITHUB_PATH
export PATH="$HOME/.local/bin:$PATH"
else
echo "taplo is already installed: $(taplo --version)"
fi
- run: taplo fmt --check
- run: taplo lint
================================================
FILE: .github/workflows/task-rust-tests.yml
================================================
# Rust Tests: CI for Rust components (DataHaven runtime and node Rust tests)
name: DataHaven Operator Rust Tests
on:
workflow_dispatch:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
jobs:
rust-tests:
name: Run Operator Rust tests
runs-on:
group: DH-runners
env:
RUSTC_WRAPPER: "sccache"
CARGO_INCREMENTAL: "0"
CARGO_TERM_COLOR: always
RUSTFLAGS: "-C linker=clang -C link-arg=-fuse-ld=mold"
SCCACHE_GHA_ENABLED: "true"
defaults:
run:
working-directory: ./operator
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: "TEST"
install-deps: false
- name: Set build flags
run: echo "RUSTFLAGS=${{ env.RUSTFLAGS }} -C linker=clang -C link-arg=-fuse-ld=mold" >> $GITHUB_ENV
- name: Run tests
run: cargo test --locked
================================================
FILE: .github/workflows/task-storage-layout.yml
================================================
# Storage Layout Check: Validates storage layout for upgradeable contracts
#
# Overview:
# 1. Compares current storage layout against committed snapshot
# 2. Runs upgrade simulation tests to verify state preservation
name: Storage Layout Check
on:
workflow_dispatch:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
env:
FOUNDRY_PROFILE: ci
jobs:
check:
name: Storage Layout
runs-on: ubuntu-latest
defaults:
run:
working-directory: contracts
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: v1.4.3
- name: Build contracts
run: forge build --extra-output storageLayout
- name: Negative check storage layout (should fail)
run: |
chmod +x scripts/check-storage-layout-negative.sh
./scripts/check-storage-layout-negative.sh
- name: Check storage layout
run: |
chmod +x scripts/check-storage-layout.sh
./scripts/check-storage-layout.sh
- name: Run upgrade simulation tests
run: forge test --match-contract StorageLayoutTest -vvv
================================================
FILE: .github/workflows/task-ts-build.yml
================================================
name: TS Build
on:
workflow_dispatch:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
jobs:
generate-wagmi:
runs-on: ubuntu-latest
name: Check Bindings are current
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Run Forge build
run: |
forge build
working-directory: contracts
- name: Install dependencies
working-directory: test
run: bun install
- name: Generate Wagmi Bindings
working-directory: test
run: bun generate:wagmi
- name: Check no local changes
run: |
changes=$(git status --porcelain .)
if [ -n "$changes" ]; then
echo "generate:wagmi produced changes:"
echo "$changes"
echo "Please run 'bun generate:wagmi' locally and commit the changes."
exit 1
else
echo "No changes"
exit 0
fi
================================================
FILE: .github/workflows/task-ts-lint.yml
================================================
name: TS Lint & Format
on:
workflow_dispatch:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
jobs:
typecheck:
runs-on: ubuntu-latest
name: Check TypeScript Types
defaults:
run:
working-directory: test
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
- name: Check Types
run: bun typecheck
format:
runs-on: ubuntu-latest
name: Check Formatting
defaults:
run:
working-directory: test
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: test/.bun-version
- uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Install dependencies
run: bun install
- name: Check Formatting
run: bun fmt
================================================
FILE: .github/workflows/task-warm-sccache.yml
================================================
# Warm sccache: Pre-populate the sccache cache for downstream Rust jobs
#
# This job runs first and compiles the project to warm up the shared
# sccache cache, ensuring better cache hit rates for parallel Rust jobs.
name: Warm sccache
on:
workflow_call:
# Explicit minimal permissions
permissions:
contents: read
jobs:
warm-cache:
name: Warm sccache cache
runs-on:
group: DH-runners
env:
RUSTC_WRAPPER: "sccache"
CARGO_INCREMENTAL: "0"
CARGO_TERM_COLOR: always
SCCACHE_GHA_ENABLED: "true"
defaults:
run:
working-directory: ./operator
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 1
- uses: ./.github/workflows/actions/setup-env
with:
cache-key: WARM
install-deps: false
- name: Set build flags
run: echo "RUSTFLAGS=${{ env.RUSTFLAGS }} -C linker=clang -C link-arg=-fuse-ld=mold" >> $GITHUB_ENV
# Compile with release mode and superset of features to warm the cache
# This covers: build-operator (fast-runtime) and rust-lint (try-runtime, runtime-benchmarks)
- name: Warm cache - release build with all features
run: |
echo "Building release with combined features to warm sccache..."
SKIP_WASM_BUILD=1 cargo check --release --locked --features fast-runtime,try-runtime,runtime-benchmarks
# Also warm the debug build cache for tests
- name: Warm cache - debug build for tests
run: |
echo "Building debug mode to warm sccache for tests..."
cargo check --locked
- name: Show sccache stats
run: sccache --show-stats
================================================
FILE: .github/workflows/weekly-audit.yml
================================================
# Rust Audit: CI for Rust audit of the operator node
#
# Overview:
# 1. Check all the dependencies from Cargo.lock for reported vulnerabilities
name: Audit Rust dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
push:
paths:
- 'Cargo.toml'
- 'Cargo.lock'
# Explicit minimal permissions
permissions:
contents: read
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install cargo audit
run: cargo install cargo-audit --locked
- name: Scan for vulnerabilities
run: cd operator && cargo audit
================================================
FILE: .gitignore
================================================
# Generated by Cargo
# will have compiled files and executables
debug/
target/
# These are backup files generated by rustfmt
**/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
# IDE directories
.vscode/
.idea/
.zed/
# cspell
cspell.json
tmp/*
# macOS system files
.DS_Store
**/.DS_Store
# Typescript directories
**/node_modules
**/.yarn
**/dist
# Spec/Wasm build directory
/build/
.worktrees/
.claude/
CLAUDE.local.md
Agents.md
.cursor/
================================================
FILE: .gitmodules
================================================
[submodule "contracts/lib/forge-std"]
path = contracts/lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "contracts/lib/eigenlayer-contracts"]
path = contracts/lib/eigenlayer-contracts
url = https://github.com/Layr-Labs/eigenlayer-contracts
[submodule "contracts/lib/snowbridge"]
path = contracts/lib/snowbridge
url = https://github.com/Moonsong-Labs/snowbridge
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
DataHaven is an EVM-compatible Substrate blockchain secured by EigenLayer. It bridges Ethereum and Substrate ecosystems through:
- EigenLayer AVS integration for security
- Snowbridge for cross-chain communication
- Frontier pallets for EVM compatibility
- External validators with rewards system
## Pre-requisites
- [Kurtosis](https://docs.kurtosis.com/install): For launching test networks
- [Bun](https://bun.sh/) v1.2+: TypeScript runtime and package manager
- [Docker](https://www.docker.com/): For container management
- [Foundry](https://getfoundry.sh/): For smart contract compilation/deployment
- [Helm](https://helm.sh/): Kubernetes package manager
- [Zig](https://ziglang.org/) (macOS only): For crossbuilding the node
## Critical Development Commands
### E2E Testing Environment (from `/test` directory)
```bash
# Setup
bun i # Install dependencies
bun cli # Interactive CLI for test environment
# Code Quality
bun fmt:fix # Fix TypeScript formatting (Biome)
bun typecheck # TypeScript type checking
# Code Generation (run after contract/runtime changes)
bun generate:wagmi # Generate TypeScript contract bindings
bun generate:types # Generate Polkadot-API types from runtime
bun generate:types:fast # Generate types with fast-runtime feature
# Local Development - Quick Start
bun cli launch # Interactive launcher (recommended)
bun start:e2e:local # Launch full local test network
bun start:e2e:verified # Launch with Blockscout + contract verification
bun start:e2e:ci # CI-optimized network launch
# Stopping Services
bun stop:e2e # Stop all test services (interactive)
bun stop:dh # Stop DataHaven only
bun stop:sb # Stop Snowbridge relayers only
bun stop:eth # Stop Ethereum network only
# Testing
bun test:e2e # Run all E2E test suites
bun test:e2e:parallel # Run tests with limited
```
### Rust/Operator Development
```bash
cd operator
cargo build --release --features fast-runtime # Development build (faster)
cargo build --release # Production build
cargo test # Run all tests
cargo fmt # Format Rust code
cargo clippy # Lint Rust code
```
### Smart Contracts (from `/contracts` directory)
```bash
forge clean # Clean build artifacts
forge build # Build contracts
forge test # Run tests
forge test -vvv # Run tests with stack traces
forge fmt # Format Solidity code
```
## Architecture Essentials
### Repository Structure
```
datahaven/
├── contracts/ # EigenLayer AVS smart contracts
├── operator/ # Substrate-based DataHaven node
│ ├── node/ # Node implementation
│ ├── pallets/ # Custom pallets (validators, rewards, transfers)
│ └── runtime/ # Runtime configurations (mainnet/stagenet/testnet)
├── test/ # E2E testing framework
│ ├── suites/ # Test scenarios
│ ├── framework/ # Test utilities
│ └── launcher/ # Network deployment tools
└── deploy/ # Kubernetes deployment charts
```
### Cross-Component Dependencies
- **Contracts → Operator**: AVS contracts register/slash operators via DataHavenServiceManager
- **Operator → Contracts**: Reads validator registry, submits performance data
- **Test → Both**: Deploys contracts, launches nodes, runs cross-chain scenarios
- **Snowbridge**: Bidirectional bridge for tokens/messages between Ethereum↔DataHaven
### Key Components
1. **DataHavenServiceManager**: Core AVS contract managing operator lifecycle
2. **RewardsRegistry**: Tracks validator performance and reward distribution
3. **External Validators Pallet**: Manages validator set on Substrate side
4. **Native Transfer Pallet**: Handles cross-chain token transfers via Snowbridge
### Testing Strategy
- **Unit Tests**: Component-specific (`cargo test`, `forge test`)
- **Integration Tests**: Full network scenarios in `/test/suites`
- **Kurtosis**: Orchestrates multi-container test environments
- **Parallel Testing**: Use `test:e2e:parallel` for faster CI runs
### Development Workflow
1. Make changes to relevant component
2. Run component-specific tests and linters
3. Regenerate bindings if contracts/runtime changed:
- `bun generate:wagmi` for contract changes
- `bun generate:types` for runtime changes
4. Build Docker image for operator changes: `bun build:docker:operator`
5. Run E2E tests to verify integration: `bun test:e2e`
6. Use `bun cli launch --verified --blockscout` for manual testing
### Common Pitfalls & Solutions
- **Types mismatch**: Regenerate with `bun generate:types` after runtime changes
- **Kurtosis not running**: Ensure Docker is running and Kurtosis engine is started
- **Contract changes not reflected**: Run `bun generate:wagmi` after modifications
- **Forge build errors**: Try `forge clean` then rebuild
- **Slow development cycle**: Use `--features fast-runtime` for faster block times
- **Network launch halts**: Check Blockscout - forge output can appear frozen
- **macOS crossbuild fails**: Ensure Zig is installed for cross-compilation
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# DataHaven 🫎
AI-First Decentralized Storage secured by EigenLayer — a verifiable storage network for AI training data, machine learning models, and Web3 applications.
## Overview
DataHaven is a decentralized storage and retrieval network designed for applications that need verifiable, production-scale data storage. Built on [StorageHub](https://github.com/Moonsong-Labs/storage-hub) and secured by EigenLayer's restaking protocol, DataHaven separates storage from verification: providers store data off-chain while cryptographic commitments are anchored on-chain for tamper-evident verification.
**Core Capabilities:**
- **Verifiable Storage**: Files are chunked, hashed into Merkle trees, and committed on-chain — enabling cryptographic proof that data hasn't been tampered with
- **Provider Network**: Main Storage Providers (MSPs) serve data with competitive offerings, while Backup Storage Providers (BSPs) ensure redundancy through decentralized replication with on-chain slashing for failed proof challenges
- **EigenLayer Security**: Validator set secured by Ethereum restaking — DataHaven validators register as EigenLayer operators with slashing for misbehavior
- **EVM Compatibility**: Full Ethereum support via Frontier pallets for smart contracts and familiar Web3 tooling
- **Cross-chain Bridge**: Native, trustless bridging with Ethereum via Snowbridge for tokens and messages
## Architecture
DataHaven combines EigenLayer's shared security with StorageHub's decentralized storage infrastructure:
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ Ethereum (L1) │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ EigenLayer AVS Contracts │ │
│ │ • DataHavenServiceManager (validator lifecycle & slashing) │ │
│ │ • RewardsRegistry (validator performance & rewards) │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ ↕ │
│ Snowbridge Protocol │
│ (trustless cross-chain messaging) │
└─────────────────────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────────────────────┐
│ DataHaven (Substrate) │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ StorageHub Pallets DataHaven Pallets │ │
│ │ • file-system (file operations) • External Validators │ │
│ │ • providers (MSP/BSP registry) • Native Transfer │ │
│ │ • proofs-dealer (challenge/verify) • Rewards │ │
│ │ • payment-streams (storage payments) • Frontier (EVM) │ │
│ │ • bucket-nfts (bucket ownership) │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────────────────────┐
│ Storage Provider Network │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Main Storage Providers │ │ Backup Storage Providers │ │
│ │ (MSP) │ │ (BSP) │ │
│ │ • User-selected │ │ • Network-assigned │ │
│ │ • Serve read requests │ │ • Replicate data │ │
│ │ • Anchor bucket roots │ │ • Proof challenges │ │
│ │ • MSP Backend service │ │ • On-chain slashing │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Indexer │ │ Fisherman │ │
│ │ • Index on-chain events │ │ • Audit storage proofs │ │
│ │ • Query storage metadata │ │ • Trigger challenges │ │
│ │ • PostgreSQL backend │ │ • Detect misbehavior │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
```
### How Storage Works
1. **Upload**: User selects an MSP, creates a bucket, and uploads files. Files are chunked (8KB default), hashed into Merkle trees, and the root is anchored on-chain.
2. **Replication**: The MSP coordinates with BSPs to replicate data across the network based on the bucket's replication policy.
3. **Retrieval**: MSP returns files with Merkle proofs that users verify against on-chain commitments.
4. **Verification**: BSPs face periodic proof challenges — failure to prove data custody results in on-chain slashing via StorageHub pallets.
## Repository Structure
```
datahaven/
├── contracts/ # EigenLayer AVS smart contracts
│ ├── src/ # Service Manager, Rewards Registry, Slasher
│ ├── script/ # Deployment scripts
│ └── test/ # Foundry test suites
├── operator/ # Substrate-based DataHaven node
│ ├── node/ # Node implementation & chain spec
│ ├── pallets/ # Custom pallets (validators, rewards, transfers)
│ └── runtime/ # Runtime configurations (mainnet/stagenet/testnet)
├── test/ # E2E testing framework
│ ├── suites/ # Integration test scenarios
│ ├── framework/ # Test utilities and helpers
│ └── launcher/ # Network deployment automation
├── deploy/ # Kubernetes deployment charts
│ ├── charts/ # Helm charts for nodes and relayers
│ └── environments/ # Environment-specific configurations
├── tools/ # GitHub automation and release scripts
└── .github/ # CI/CD workflows
```
Each directory contains its own README with detailed information. See:
- [contracts/README.md](contracts/README.md) - Smart contract development
- [operator/README.md](operator/README.md) - Node building and runtime development
- [test/README.md](test/README.md) - E2E testing and network deployment
- [deploy/README.md](deploy/README.md) - Kubernetes deployment
- [tools/README.md](tools/README.md) - Development tools
## Quick Start
### Prerequisites
- [Kurtosis](https://docs.kurtosis.com/install) - Network orchestration
- [Bun](https://bun.sh/) v1.3.2+ - TypeScript runtime
- [Docker](https://www.docker.com/) - Container management
- [Foundry](https://getfoundry.sh/) - Solidity toolkit
- [Rust](https://www.rust-lang.org/tools/install) - For building the operator
- [Helm](https://helm.sh/) - Kubernetes deployments (optional)
- [Zig](https://ziglang.org/) - For macOS cross-compilation (macOS only)
### Launch Local Network
The fastest way to get started is with the interactive CLI:
```bash
cd test
bun i # Install dependencies
bun cli launch # Interactive launcher with prompts
```
This deploys a complete environment including:
- **Ethereum network**: 2x EL clients (reth), 2x CL clients (lodestar)
- **Block explorers**: Blockscout (optional), Dora consensus explorer
- **DataHaven node**: Single validator with fast block times
- **Storage providers**: MSP and BSP nodes for decentralized storage
- **AVS contracts**: Deployed and configured on Ethereum
- **Snowbridge relayers**: Bidirectional message passing
For more options and detailed instructions, see the [test README](./test/README.md).
### Run Tests
```bash
cd test
bun test:e2e # Run all integration tests
bun test:e2e:parallel # Run with limited concurrency
```
NOTES: Adding the environment variable `INJECT_CONTRACTS=true` will inject the contracts when starting the tests to speed up setup.
### Development Workflows
**Smart Contract Development**:
```bash
cd contracts
forge build # Compile contracts
forge test # Run contract tests
```
**Node Development**:
```bash
cd operator
cargo build --release --features fast-runtime
cargo test
./scripts/run-benchmarks.sh
```
**After Making Changes**:
```bash
cd test
bun generate:wagmi # Regenerate contract bindings
bun generate:types # Regenerate runtime types
```
## Key Features
### Verifiable Decentralized Storage
Production-scale storage with cryptographic guarantees:
- **Buckets**: User-created containers managed by an MSP, summarized by a Merkle-Patricia trie root on-chain
- **Files**: Deterministically chunked, hashed into Merkle trees, with roots serving as immutable fingerprints
- **Proofs**: Merkle proofs enable verification of data integrity without trusting intermediaries
- **Audits**: BSPs prove ongoing data custody via randomized proof challenges
### Storage Provider Network
Two-tier provider model balancing performance and reliability:
- **MSPs**: User-selected providers offering data retrieval with competitive service offerings
- **BSPs**: Network-assigned backup providers ensuring data redundancy and availability, with on-chain slashing for failed proof challenges
- **Fisherman**: Auditing service that monitors proofs and triggers challenges for misbehavior
- **Indexer**: Indexes on-chain storage events for efficient querying
### EigenLayer Security
DataHaven validators secured through Ethereum restaking:
- Validators register as operators via `DataHavenServiceManager` contract
- Economic security through ETH restaking
- Slashing for validator misbehavior (separate from BSP slashing which is on-chain)
- Performance-based validator rewards through `RewardsRegistry`
### EVM Compatibility
Full Ethereum Virtual Machine support via Frontier pallets:
- Deploy Solidity smart contracts
- Use existing Ethereum tooling (MetaMask, Hardhat, etc.)
- Compatible with ERC-20, ERC-721, and other standards
### Cross-chain Communication
Trustless bridging via Snowbridge:
- Native token transfers between Ethereum ↔ DataHaven
- Cross-chain message passing
- Finality proofs via BEEFY consensus
- Three specialized relayers (beacon, BEEFY, execution)
## Use Cases
DataHaven is designed for applications requiring verifiable, tamper-proof data storage:
- **AI & Machine Learning**: Store training datasets, model weights, and agent configurations with cryptographic proofs of integrity — enabling federated learning and verifiable AI pipelines
- **DePIN (Decentralized Physical Infrastructure)**: Persistent storage for IoT sensor data, device configurations, and operational logs with provable data lineage
- **Real World Assets (RWAs)**: Immutable storage for asset documentation, ownership records, and compliance data with on-chain verification
## Docker Images
Production images published to [DockerHub](https://hub.docker.com/r/datahavenxyz/datahaven).
**Build optimizations**:
- [sccache](https://github.com/mozilla/sccache) - Rust compilation caching
- [cargo-chef](https://lpalmieri.com/posts/fast-rust-docker-builds/) - Dependency layer caching
- [BuildKit cache mounts](https://docs.docker.com/build/cache/optimize/#use-cache-mounts) - External cache restoration
**Build locally**:
```bash
cd test
bun build:docker:operator # Creates datahavenxyz/datahaven:local
```
## Development Environment
### VS Code Configuration
IDE configurations are excluded from version control for personalization, but these settings are recommended for optimal developer experience. Add to your `.vscode/settings.json`:
**Rust Analyzer**:
```json
{
"rust-analyzer.linkedProjects": ["./operator/Cargo.toml"],
"rust-analyzer.cargo.allTargets": true,
"rust-analyzer.procMacro.enable": false,
"rust-analyzer.server.extraEnv": {
"CARGO_TARGET_DIR": "target/.rust-analyzer",
"SKIP_WASM_BUILD": 1
},
"rust-analyzer.diagnostics.disabled": ["unresolved-macro-call"],
"rust-analyzer.cargo.buildScripts.enable": false
}
```
Optimizations:
- Links `operator/` directory as the primary Rust project
- Disables proc macros and build scripts for faster analysis (Substrate macros are slow)
- Uses dedicated target directory to avoid conflicts
- Skips WASM builds during development
**Solidity** ([Juan Blanco's extension](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity)):
```json
{
"solidity.formatter": "forge",
"solidity.compileUsingRemoteVersion": "v0.8.28+commit.7893614a",
"[solidity]": {
"editor.defaultFormatter": "JuanBlanco.solidity"
}
}
```
Note: Solidity version must match [foundry.toml](./contracts/foundry.toml)
**TypeScript** ([Biome](https://github.com/biomejs/biome)):
```json
{
"biome.lsp.bin": "test/node_modules/.bin/biome",
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome",
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "always"
}
}
}
```
## CI/CD
### Local CI Testing
Run GitHub Actions workflows locally using [act](https://github.com/nektos/act):
```bash
# Run E2E workflow
act -W .github/workflows/e2e.yml -s GITHUB_TOKEN="$(gh auth token)"
# Run specific job
act -W .github/workflows/e2e.yml -j test-job-name
```
### Automated Workflows
The repository includes GitHub Actions for:
- **E2E Testing**: Full integration tests on PR and main branch
- **Contract Testing**: Foundry test suites for smart contracts
- **Rust Testing**: Unit and integration tests for operator
- **Docker Builds**: Multi-platform image builds with caching
- **Release Automation**: Version tagging and changelog generation
See `.github/workflows/` for workflow definitions.
## Contributing
### Development Cycle
1. **Make Changes**: Edit contracts, runtime, or tests
2. **Run Tests**: Component-specific tests (`forge test`, `cargo test`)
3. **Regenerate Types**: Update bindings if contracts/runtime changed
4. **Integration Test**: Run E2E tests to verify cross-component behavior
5. **Code Quality**: Format and lint (`cargo fmt`, `forge fmt`, `bun fmt:fix`)
### Common Pitfalls
- **Type mismatches**: Regenerate with `bun generate:types` after runtime changes
- **Contract changes not reflected**: Run `bun generate:wagmi` after modifications
- **Kurtosis issues**: Ensure Docker is running and Kurtosis engine is started
- **Slow development**: Use `--features fast-runtime` for shorter epochs/eras (block time stays 6s)
- **Network launch hangs**: Check Blockscout - forge output can appear frozen
See [CLAUDE.md](./CLAUDE.md) for detailed development guidance.
## License
GPL-3.0 - See LICENSE file for details
## Links
- [DataHaven Website](https://datahaven.xyz/)
- [DataHaven Documentation](https://docs.datahaven.xyz/)
- [StorageHub Repository](https://github.com/Moonsong-Labs/storage-hub)
- [EigenLayer Documentation](https://docs.eigenlayer.xyz/)
- [Substrate Documentation](https://docs.substrate.io/)
- [Snowbridge Documentation](https://docs.snowbridge.network/)
- [Foundry Book](https://book.getfoundry.sh/)
- [Polkadot-API Documentation](https://papi.how/)
================================================
FILE: biome.json
================================================
{
"$schema": "https://biomejs.dev/schemas/2.0.0-beta.5/schema.json",
"files": {
"includes": [
"**/*.js",
"**/*.ts",
"**/*.json",
"**/*.yml",
"**/*.md",
"!node_modules/*",
"!**/moonwall/**/*",
"!target/*",
"!**/tmp/*",
"!**/*.spec.json",
"!**/.papi/descriptors/**/*",
"!**/contract-bindings/**/*",
"!**/html/**/*",
"!**/moonwall/contracts/out/**/*",
"!**/contracts/out/**/*",
"!**/contracts/deployments/state-diff.checksum",
"!**/bun.lock"
],
"maxSize": 3000000
},
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"formatter": {
"enabled": true,
"attributePosition": "multiline",
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"json": {
"formatter": {
"enabled": true
}
},
"javascript": {
"formatter": {
"trailingCommas": "none",
"semicolons": "always",
"quoteStyle": "double"
}
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"correctness": {
"noUnusedVariables": "warn",
"noUnusedImports": "warn"
},
"suspicious": {
"noExplicitAny": "off",
"noAsyncPromiseExecutor": "off"
},
"performance": {
"noAccumulatingSpread": "off"
},
"nursery": {
"noFloatingPromises": "error"
},
"style": {
"noParameterAssign": "error",
"useAsConstAssertion": "error",
"useDefaultParameterLast": "error",
"useEnumInitializers": "error",
"useSelfClosingElements": "error",
"useSingleVarDeclarator": "error",
"noUnusedTemplateLiteral": "error",
"useNumberNamespace": "error",
"noInferrableTypes": "error",
"noUselessElse": "error",
"noNonNullAssertion": "off"
}
}
}
}
================================================
FILE: contracts/.gitignore
================================================
# Compiler files
cache/
out/
# Ignores development broadcast logs (autogenerated by forge script --broadcast)
broadcast/
# Docs
docs/
# Dotenv file
.env
# Local CLAUDE configuration
CLAUDE.local.md
================================================
FILE: contracts/README.md
================================================
# DataHaven AVS Smart Contracts
Implements the Actively Validated Service (AVS) logic for DataHaven, secured by EigenLayer. These contracts manage operator registration, handle cross-chain rewards via Snowbridge, and enforce slashing.
## Project Structure
```
contracts/
├── src/
│ ├── DataHavenServiceManager.sol # Core AVS service manager
│ ├── middleware/ # RewardsRegistry, Snowbridge helpers
│ ├── interfaces/ # Contract interfaces
│ └── libraries/ # Utility libraries
├── script/ # Deployment & setup scripts
├── lib/ # External dependencies (EigenLayer, Snowbridge, OpenZeppelin)
└── test/ # Foundry test suites
```
## Key Components
- **DataHavenServiceManager** (`src/DataHavenServiceManager.sol`): Core contract for operator lifecycle; inherits `ServiceManagerBase`.
- **RewardsRegistry** (`src/middleware/RewardsRegistry.sol`): Tracks validator performance and distributes rewards via Snowbridge.
## Development
Requires [Foundry](https://book.getfoundry.sh).
```bash
# Build and Test
forge build
forge test
# Regenerate TS bindings (after contract changes)
cd ../test && bun generate:wagmi
```
## Configuration
Deployment parameters (EigenLayer addresses, initial validators, owners) are defined in `contracts/config/<network>.json`.
- **Do not edit** `Config.sol` or `DeployParams.s.sol` directly; they only load the JSON.
- Ensure `contracts/config/hoodi.json` matches your target environment before deploying.
## Deployment
Two deployment paths exist: **Local** (Anvil) and **Testnet** (Hoodi). Both install the **DataHaven AVS contracts** (ServiceManager, RewardsRegistry) and **Snowbridge** (BeefyClient, Gateway, Agent). They differ in EigenLayer setup:
### Local (Anvil)
**`DeployLocal.s.sol`** bootstraps a full EigenLayer core deployment (DelegationManager, StrategyManager, AVSDirectory, etc.) alongside DataHaven AVS and Snowbridge.
```bash
anvil
forge script script/deploy/DeployLocal.s.sol --rpc-url anvil --broadcast
```
### Testnet (Hoodi)
**`DeployTestnet.s.sol`** references existing EigenLayer contracts (addresses from `contracts/config/<network>.json`) and only deploys DataHaven AVS + Snowbridge.
```bash
NETWORK=hoodi forge script script/deploy/DeployTestnet.s.sol \
--rpc-url hoodi \
--private-key $PRIVATE_KEY \
--broadcast
```
Supported networks: `hoodi` (no mainnet config yet). Artifacts → `contracts/deployments/<network>.json`.
## How It Works
1. **Registration**: Validators register with EigenLayer via `DataHavenServiceManager`.
2. **Performance Tracking**: DataHaven computes reward points and sends a Merkle root to `RewardsRegistry` on Ethereum via Snowbridge.
3. **Rewards Claims**: Validators claim rewards on Ethereum from `RewardsRegistry` using Merkle proofs.
4. **Slashing**: Misbehavior triggers slashing.
See `test/README.md` for full network integration tests.
================================================
FILE: contracts/VERSION
================================================
0.20.0
================================================
FILE: contracts/config/anvil.json
================================================
{
"eigenLayer": {
"pausers": [
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
],
"unpauser": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
"rewardsUpdater": "0x90F79bf6EB2c4f870365E785982E1f101E93b906",
"calculationIntervalSeconds": 86400,
"maxRewardsDuration": 6048000,
"maxRetroactiveLength": 7776000,
"maxFutureLength": 2592000,
"genesisRewardsTimestamp": 1710979200,
"activationDelay": 7200,
"globalCommissionBips": 1000,
"executorMultisig": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65",
"operationsMultisig": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc",
"minWithdrawalDelayBlocks": 50,
"delegationInitPausedStatus": 0,
"eigenPodManagerInitPausedStatus": 0,
"rewardsCoordinatorInitPausedStatus": 0,
"allocationManagerInitPausedStatus": 0,
"deallocationDelay": 50,
"allocationConfigurationDelay": 0,
"beaconChainGenesisTimestamp": 1695902400
},
"avs": {
"avsOwner": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
"rewardsInitiator": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955",
"validatorSetSubmitter": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
"validatorsStrategies": []
},
"snowbridge": {
"randaoCommitDelay": 4,
"randaoCommitExpiration": 24,
"minNumRequiredSignatures": 2,
"startBlock": 1,
"messageOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000",
"initialValidatorSetId": 0,
"initialValidatorHashes": [
"0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7",
"0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde"
],
"nextValidatorSetId": 1,
"nextValidatorHashes": [
"0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7",
"0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde"
]
}
}
================================================
FILE: contracts/config/example.jsonc
================================================
//! REMOVE ALL COMMENTS AND CHANGE EXTENSION TO `.json` BEFORE USING
//! Parsing JSONC is not supported by the Solidity JSON parser, so we need to remove the comments before using the config
{
"eigenLayer": {
"pausers": [
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
],
"unpauser": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
/// Account authorised to update pending rewards merkle root in the RewardsCoordinator contract.
/// In practice, this is the account used by the off-chain rewards updater service.
/// See https://github.com/Layr-Labs/eigenlayer-contracts/tree/dev/docs#rewardscoordinator
"rewardsUpdater": "0x90F79bf6EB2c4f870365E785982E1f101E93b906",
/// The interval at which the new rewards merkle root is calculated.
/// See testnet deployment: https://hoodi.etherscan.io/address/0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7#readProxyContract#F1
"calculationIntervalSeconds": 86400,
/// The maximum duration of rewards that can be retroactively applied.
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F5
"maxRewardsDuration": 6048000,
/// The maximum retroactive length of rewards that can be applied.
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F4
"maxRetroactiveLength": 7776000,
/// The maximum duration of rewards that can be applied in the future.
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F3
"maxFutureLength": 2592000,
/// The timestamp at which rewards are first calculated.
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F2
"genesisRewardsTimestamp": 1710979200,
/// Delay in timestamp (seconds) before a posted root can be claimed against
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F6
"activationDelay": 7200,
/// Also called "defaultOperatorSplitBips"
/// Used off-chain by the rewards updater to calculate an Operator's split for a specific reward.
/// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F7
"globalCommissionBips": 1000,
/// Multisig address for controlling operations (we don't care as much about this).
"executorMultisig": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65",
/// Multisig address for executing operations (we don't care as much about this).
"operationsMultisig": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc",
/// The delay in blocks before withdrawals can be completed.
/// See testnet deployment: https://hoodi.etherscan.io/address/0x867837a9722C512e0862d8c2E15b8bE220E8b87d#readProxyContract#F24
"minWithdrawalDelayBlocks": 50,
/// The initial paused status of the DelegationManager
/// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12
"delegationInitPausedStatus": 0,
/// The initial paused status of the EigenPodManager
/// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12
"eigenPodManagerInitPausedStatus": 0,
/// The initial paused status of the RewardsCoordinator
/// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12
"rewardsCoordinatorInitPausedStatus": 0,
/// The initial paused status of the AllocationManager
/// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12
"allocationManagerInitPausedStatus": 0,
/// The delay in blocks before deallocations can be completed.
/// See testnet deployment: https://hoodi.etherscan.io/address/0x95a7431400F362F3647a69535C5666cA0133CAA0#readProxyContract#F2
"deallocationDelay": 50,
/// The delay in blocks before allocation configuration can be completed.
/// See testnet deployment: https://hoodi.etherscan.io/address/0x95a7431400F362F3647a69535C5666cA0133CAA0#readProxyContract#F1
"allocationConfigurationDelay": 75,
/// The genesis time of the beacon state, to help EL calculate conversions between slot and timestamp
/// See EigenPodManager: https://hoodi.etherscan.io/address/0xcd1442415Fc5C29Aa848A49d2e232720BE07976c
"beaconChainGenesisTimestamp": 1695902400
},
"avs": {
/// The owner of the DataHaven Service Manager contract.
"avsOwner": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
/// The address of the account that initiates the rewards calculation.
/// This is for the EigenLayer rewards distribution way, using the RewardsCoordinator.
/// But for now, we're not using it, and instead sending the rewards directly.
"rewardsInitiator": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955",
/// The EigenLayer strategy addresses for the Validators to stake into.
/// The beaconChainETHStrategy is a virtual address representing native beacon chain ETH.
/// All networks:
/// - beaconChainETH: 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0 (virtual, same on all networks)
/// Hoodi testnet strategies:
/// - stETH: 0xf8a1a66130d614c7360e868576d5e59203475fe0
/// - WETH: 0x24579aD4fe83aC53546E5c2D3dF5F85D6383420d
/// Mainnet strategies:
/// - stETH: 0x93c4b944D05dfe6df7645A86cd2206016c51564D
/// - rETH: 0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2
/// - cbETH: 0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc
"validatorsStrategies": [
"0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0"
]
},
"snowbridge": {
/// Minimum delay in number of blocks that a relayer must wait between calling
/// submitInitial and commitPrevRandao. In production this should be set to MAX_SEED_LOOKAHEAD:
/// https://eth2book.info/altair/part3/config/preset#max_seed_lookahead
"randaoCommitDelay": 4,
/// after randaoCommitDelay is reached, relayer must call commitPrevRandao within this number of blocks.
/// Without this expiration, relayers can roll the dice infinitely to get the subsampling
/// they desire.
"randaoCommitExpiration": 24,
/// The minimum number of required signatures for a Randao commit to be valid.
/// Auto-calculated by update-beefy-checkpoint as ceil(validators * 2/3) for BFT security.
"minNumRequiredSignatures": 2,
/// Initial BEEFY block number. Set to latest finalized block by update-beefy-checkpoint.
/// The BeefyClient will only accept BEEFY commitments with block numbers > startBlock.
"startBlock": 1,
/// The origin linked to the Agent, the Agent contract who's allowed to submit
/// new reward merkle roots or slashes.
"messageOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000",
/// The BEEFY validator set ID for the initial validators.
/// This is fetched from Beefy.ValidatorSetId on the DataHaven chain.
"initialValidatorSetId": 0,
/// The initial validator hashes for the BEEFY light client.
/// Each hash is keccak256(ethereum_address) derived from the BEEFY authority public keys.
"initialValidatorHashes": [
"0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199914b9e5506744e80bd0fd33d",
"0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e"
],
/// The BEEFY validator set ID for the next validators (initialValidatorSetId + 1).
"nextValidatorSetId": 1,
/// The next validator hashes for the BEEFY light client.
/// Each hash is keccak256(ethereum_address) derived from the BEEFY authority public keys.
"nextValidatorHashes": [
"0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199914b9e5506744e80bd0fd33d",
"0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e"
]
}
}
================================================
FILE: contracts/config/mainnet-ethereum.json
================================================
{
"eigenLayer": {
"pausers": [],
"unpauser": "0x0000000000000000000000000000000000000000",
"rewardsUpdater": "0x0000000000000000000000000000000000000000",
"calculationIntervalSeconds": 86400,
"maxRewardsDuration": 6048000,
"maxRetroactiveLength": 7776000,
"maxFutureLength": 2592000,
"genesisRewardsTimestamp": 1710979200,
"activationDelay": 7200,
"globalCommissionBips": 1000,
"executorMultisig": "0x0000000000000000000000000000000000000000",
"operationsMultisig": "0x0000000000000000000000000000000000000000",
"minWithdrawalDelayBlocks": 50400,
"delegationInitPausedStatus": 0,
"eigenPodManagerInitPausedStatus": 0,
"rewardsCoordinatorInitPausedStatus": 0,
"allocationManagerInitPausedStatus": 0,
"deallocationDelay": 100800,
"allocationConfigurationDelay": 1200,
"beaconChainGenesisTimestamp": 1606824023,
"delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
"strategyManager": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A",
"eigenPodManager": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338",
"avsDirectory": "0x135dda560e946695d6f155dacafc6f1f25c1f5af",
"rewardsCoordinator": "0x7750d328b314EfFa365A0402CcfD489B80B0adda",
"allocationManager": "0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39",
"permissionController": "0x25E5F8B1E7aDf44518d35D5B2271f114e081f0E5"
},
"avs": {
"avsOwner": "0x0000000000000000000000000000000000000000",
"rewardsInitiator": "0x0000000000000000000000000000000000000000",
"validatorsStrategies": [
"0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0",
"0x93c4b944D05dfe6df7645A86cd2206016c51564D",
"0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
"0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc"
]
},
"snowbridge": {
"randaoCommitDelay": 4,
"randaoCommitExpiration": 24,
"minNumRequiredSignatures": 16,
"startBlock": 1,
"messageOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000",
"initialValidatorSetId": 0,
"initialValidatorHashes": [],
"nextValidatorSetId": 1,
"nextValidatorHashes": []
}
}
================================================
FILE: contracts/config/stagenet-hoodi.json
================================================
{
"eigenLayer": {
"pausers": [
"0x64D78399B0fa32EA72959f33edCF313159F3c13D"
],
"unpauser": "0xE3328cb5068924119d6170496c4AB2dD12c12d15",
"rewardsUpdater": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e",
"calculationIntervalSeconds": 86400,
"maxRewardsDuration": 6048000,
"maxRetroactiveLength": 7776000,
"maxFutureLength": 2592000,
"genesisRewardsTimestamp": 1710979200,
"activationDelay": 7200,
"globalCommissionBips": 1000,
"executorMultisig": "0xE3328cb5068924119d6170496c4AB2dD12c12d15",
"operationsMultisig": "0xE7f4E30D2619273468afe9EC0Acf805E55532257",
"minWithdrawalDelayBlocks": 50,
"delegationInitPausedStatus": 0,
"eigenPodManagerInitPausedStatus": 0,
"rewardsCoordinatorInitPausedStatus": 0,
"allocationManagerInitPausedStatus": 0,
"deallocationDelay": 50,
"allocationConfigurationDelay": 75,
"beaconChainGenesisTimestamp": 1710666600,
"delegationManager": "0x867837a9722C512e0862d8c2E15b8bE220E8b87d",
"strategyManager": "0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41",
"eigenPodManager": "0xcd1442415Fc5C29Aa848A49d2e232720BE07976c",
"avsDirectory": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
"rewardsCoordinator": "0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7",
"allocationManager": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
"permissionController": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2"
},
"avs": {
"avsOwner": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e",
"rewardsInitiator": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e",
"validatorsStrategies": [
"0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0",
"0xf8a1a66130d614c7360e868576d5e59203475fe0",
"0x24579aD4fe83aC53546E5c2D3dF5F85D6383420d"
]
},
"snowbridge": {
"randaoCommitDelay": 4,
"randaoCommitExpiration": 24,
"minNumRequiredSignatures": 3,
"startBlock": 1303065,
"messageOrigin": "0x56490bd3f367447bfaf57bb18e7a45e1b2db7d538fe42098e87d2aa106c6afdd",
"initialValidatorSetId": 2186,
"initialValidatorHashes": [
"0x07ce4f2cd558f4d4b529a3362b6ff7d616ca0893b53252dc62829b8218ea5c10",
"0xaea5344f086d3be7c94cf3a47436bcbb98de23cf1ee773a9180cfecab0453a50",
"0xcd3a33755b27fe810dfb780b3f1df1c25efa1bb826ca618e41022fa900876087",
"0x4f4ce8cad711a4b33d15095091f8a98eaf9bfd1b39a9159e605cf5d6783cc667"
],
"nextValidatorSetId": 2187,
"nextValidatorHashes": [
"0x07ce4f2cd558f4d4b529a3362b6ff7d616ca0893b53252dc62829b8218ea5c10",
"0xaea5344f086d3be7c94cf3a47436bcbb98de23cf1ee773a9180cfecab0453a50",
"0xcd3a33755b27fe810dfb780b3f1df1c25efa1bb826ca618e41022fa900876087",
"0x4f4ce8cad711a4b33d15095091f8a98eaf9bfd1b39a9159e605cf5d6783cc667"
]
}
}
================================================
FILE: contracts/config/testnet-hoodi.json
================================================
{
"eigenLayer": {
"pausers": [
"0x64D78399B0fa32EA72959f33edCF313159F3c13D"
],
"unpauser": "0xE3328cb5068924119d6170496c4AB2dD12c12d15",
"rewardsUpdater": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e",
"calculationIntervalSeconds": 86400,
"maxRewardsDuration": 6048000,
"maxRetroactiveLength": 7776000,
"maxFutureLength": 2592000,
"genesisRewardsTimestamp": 1710979200,
"activationDelay": 7200,
"globalCommissionBips": 1000,
"executorMultisig": "0xE3328cb5068924119d6170496c4AB2dD12c12d15",
"operationsMultisig": "0xE7f4E30D2619273468afe9EC0Acf805E55532257",
"minWithdrawalDelayBlocks": 50,
"delegationInitPausedStatus": 0,
"eigenPodManagerInitPausedStatus": 0,
"rewardsCoordinatorInitPausedStatus": 0,
"allocationManagerInitPausedStatus": 0,
"deallocationDelay": 50,
"allocationConfigurationDelay": 75,
"beaconChainGenesisTimestamp": 1710666600,
"delegationManager": "0x867837a9722C512e0862d8c2E15b8bE220E8b87d",
"strategyManager": "0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41",
"eigenPodManager": "0xcd1442415Fc5C29Aa848A49d2e232720BE07976c",
"avsDirectory": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
"rewardsCoordinator": "0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7",
"allocationManager": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
"permissionController": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2"
},
"avs": {
"avsOwner": "0x0000000000000000000000000000000000000000",
"rewardsInitiator": "0x0000000000000000000000000000000000000000",
"validatorsStrategies": [
"0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0",
"0xf8a1a66130d614c7360e868576d5e59203475fe0",
"0x24579aD4fe83aC53546E5c2D3dF5F85D6383420d"
]
},
"snowbridge": {
"randaoCommitDelay": 4,
"randaoCommitExpiration": 24,
"minNumRequiredSignatures": 5,
"startBlock": 1381173,
"messageOrigin": "0xd0d6dbd1ffb401ef613f00e93cd5061ecec03ae35d2f820cd6754a5b5f020215",
"initialValidatorSetId": 2303,
"initialValidatorHashes": [
"0x0ec3102f334aba804c18b843e45ec874005587122a1b49273b1b04d6fd98b1a2",
"0xb277ac8a7aafc125d7da813a9b0fdae144922c165bfae194ebd94d6f3e4fe68e",
"0xcc6aefdce3f83d204893cb57388a72b4553b613f95b437ce548582470e62d1e7",
"0xcefa9940d25d21ac6d0a579727e8812283ed00d7ace9dfc9e30a0f95a0ea7bdd",
"0x8e720aed537cb30d204f1de9fb5aab6e0129acfc3f41a3c69259231c1f0f2685",
"0x5f883131cf6667cb8c2279caa182298e174bbca35c7c8c5679df6bad73be85cf",
"0x744ae85e99103a5ebcf9dd2fdcc18743012f0336f497fd3a05243a26a1a031b7"
],
"nextValidatorSetId": 2304,
"nextValidatorHashes": [
"0x0ec3102f334aba804c18b843e45ec874005587122a1b49273b1b04d6fd98b1a2",
"0xb277ac8a7aafc125d7da813a9b0fdae144922c165bfae194ebd94d6f3e4fe68e",
"0xcc6aefdce3f83d204893cb57388a72b4553b613f95b437ce548582470e62d1e7",
"0xcefa9940d25d21ac6d0a579727e8812283ed00d7ace9dfc9e30a0f95a0ea7bdd",
"0x8e720aed537cb30d204f1de9fb5aab6e0129acfc3f41a3c69259231c1f0f2685",
"0x5f883131cf6667cb8c2279caa182298e174bbca35c7c8c5679df6bad73be85cf",
"0x744ae85e99103a5ebcf9dd2fdcc18743012f0336f497fd3a05243a26a1a031b7"
]
}
}
================================================
FILE: contracts/deployments/anvil-agent-info.json
================================================
{"Agent": "0xac06641381166cf085281c45292147f833C622d7","AgentOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000"}
================================================
FILE: contracts/deployments/anvil-rewards-info.json
================================================
{"RewardsAgent": "0xac06641381166cf085281c45292147f833C622d7","AgentOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000"}
================================================
FILE: contracts/deployments/anvil.json
================================================
{
"network": "anvil",
"BeefyClient": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf",
"AgentExecutor": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF",
"Gateway": "0x9d4454B023096f34B160D6B654540c56A1F81688",
"ServiceManager": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
"ServiceManagerImplementation": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
"ProxyAdmin": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788",
"RewardsAgent": "0xac06641381166cf085281c45292147f833C622d7",
"DelegationManager": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82",
"StrategyManager": "0x9A676e781A523b5d0C0e43731313A708CB607508",
"AVSDirectory": "0x0B306BF915C4d645ff596e518fAf3F9669b97016",
"EigenPodManager": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1",
"EigenPodBeacon": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1",
"RewardsCoordinator": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE",
"AllocationManager": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed",
"PermissionController": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c",
"ETHPOSDeposit": "0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141",
"BaseStrategyImplementation": "0xf5059a5D33d5853360D16C683c16e67980206f36",
"DeployedStrategies": [
{
"address": "0x998abeb3E57409262aE5b751f60747921B33613E",
"underlyingToken": "0x95401dc811bb5740090279Ba06cfA8fcF6113778",
"tokenCreator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
]
}
================================================
FILE: contracts/deployments/hoodi.json
================================================
{
"network": "hoodi",
"BeefyClient": "0x109F9D0064D68639552d9aE037D67186EC870a1f",
"AgentExecutor": "0xfd44dC7B88d1C5186f5b60A0576245055F9dBEeB",
"Gateway": "0x0B13aAD3f9bD6bEFB9a4B678E6804b172f320C25",
"ServiceManager": "0xd69a0181D5d89827648E681cA6a4Cd517dEE8f1B",
"ServiceManagerImplementation": "0x9F4Fbc2A95d21d58BE029C8F6a656856E16833D6",
"RewardsAgent": "0xeAd1BB0eA0e203f88d6D332F19910dcdF4A3B1A8",
"DelegationManager": "0x867837a9722C512e0862d8c2E15b8bE220E8b87d",
"StrategyManager": "0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41",
"AVSDirectory": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
"RewardsCoordinator": "0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7",
"AllocationManager": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
"PermissionController": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2"
}
================================================
FILE: contracts/deployments/metadata.json
================================================
{
"name": "DataHaven",
"website": "https://datahaven.xyz/",
"description": "DataHaven is a decentralized, EigenLayer-secured AVS for distributed storage. By leveraging restaking, it ensures tamper-proof, censorship-resistant, and verifiable data persistence. Designed with AI and Web3 ecosystems in mind, DataHaven integrates seamlessly with smart contracts, offering developers reliable storage infrastructure for models, logs, and digital assets at scale.",
"logo": "https://raw.githubusercontent.com/datahaven-xyz/datahaven/refs/heads/main/contracts/deployments/datahaven-logo.png",
"twitter": "https://x.com/datahaven_xyz"
}
================================================
FILE: contracts/deployments/stagenet-hoodi-rewards-info.json
================================================
{"RewardsAgent": "0x2E039a88838241d1Ac738cf2e3C5763ba12571e7","AgentOrigin": "0x56490bd3f367447bfaf57bb18e7a45e1b2db7d538fe42098e87d2aa106c6afdd"}
================================================
FILE: contracts/deployments/stagenet-hoodi.json
================================================
{
"network": "stagenet-hoodi",
"BeefyClient": "0xE65dc4eCA2Fd428361076e1f204731224CeB4292",
"AgentExecutor": "0x35d3FdCB19A246a1763421168dF69dA3dE207063",
"Gateway": "0xE9352f1488F12bFEd722c133C129ca5F467463d1",
"ServiceManager": "0xED73cCaF067cebC706B2B3a6cf2b9af2c696c6d3",
"ServiceManagerImplementation": "0x0Af4a129D0F3d57B5bD51CAB323EA114C28c064a",
"RewardsAgent": "0x2E039a88838241d1Ac738cf2e3C5763ba12571e7",
"DelegationManager": "0x867837a9722C512e0862d8c2E15b8bE220E8b87d",
"StrategyManager": "0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41",
"AVSDirectory": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
"RewardsCoordinator": "0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7",
"AllocationManager": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
"PermissionController": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2",
"ProxyAdmin": "0xeb1a705e1aa96e6a6329d8a8eb0f5ec38eb7b69d"
}
================================================
FILE: contracts/deployments/state-diff.checksum
================================================
d7d30510de741750e5b2069228eb2b037f20cc22
================================================
FILE: contracts/deployments/state-diff.json
================================================
{
"24": {
"address": "0x0000BBdDc7CE488642fb579F8B00f3a590007251",
"code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd00",
"storage": {}
},
"8": {
"address": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF",
"code": "0x60806040526004361061003e575f3560e01c806305b1137b1461004257806325ccedec14610063578063c6b295c114610082578063d0e30db014610061575b5f5ffd5b34801561004d575f5ffd5b5061006161005c36600461025e565b6100a1565b005b34801561006e575f5ffd5b5061006161007d366004610288565b6100b8565b34801561008d575f5ffd5b5061006161009c3660046102ef565b6100da565b6100b46001600160a01b038316826100f7565b5050565b6100d56001600160a01b038416836001600160801b038416610120565b505050565b5f6100e6848484610171565b9050806100f1575f5ffd5b50505050565b5f5f5f5f5f85875af19050806100d557604051633d2cec6f60e21b815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526100d590849060640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b179052610188565b5f5f5f5f85516020870186895af195945050505050565b5f5f836001600160a01b0316836040516101a291906103be565b5f604051808303815f865af19150503d805f81146101db576040519150601f19603f3d011682016040523d82523d5f602084013e6101e0565b606091505b50915091505f82801561020b57508151158061020b57508180602001905181019061020b91906103d4565b905080158061022257506001600160a01b0385163b155b156102405760405163022e258160e11b815260040160405180910390fd5b5050505050565b6001600160a01b038116811461025b575f5ffd5b50565b5f5f6040838503121561026f575f5ffd5b823561027a81610247565b946020939093013593505050565b5f5f5f6060848603121561029a575f5ffd5b83356102a581610247565b925060208401356102b581610247565b915060408401356001600160801b03811681146102d0575f5ffd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f60608486031215610301575f5ffd5b833561030c81610247565b9250602084013567ffffffffffffffff811115610327575f5ffd5b8401601f81018613610337575f5ffd5b803567ffffffffffffffff811115610351576103516102db565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610380576103806102db565b604052818152828201602001881015610397575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f82518060208501845e5f920191825250919050565b5f602082840312156103e4575f5ffd5b815180151581146103f3575f5ffd5b939250505056fea2646970667358221220590055fea5441ad6e827390b16005643886d2dc4ffe2b97b43ed3ab207076ab664736f6c634300081c003300",
"storage": {}
},
"13": {
"address": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1",
"code": "0x608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80633659cfe6146100595780635c60da1b1461006e578063715018a6146100975780638da5cb5b1461009f578063f2fde38b146100af575b5f5ffd5b61006c6100673660046102d7565b6100c2565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006c610109565b5f546001600160a01b031661007b565b61006c6100bd3660046102d7565b61011c565b6100ca61019a565b6100d3816101f3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b61011161019a565b61011a5f610288565b565b61012461019a565b6001600160a01b03811661018e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019781610288565b50565b5f546001600160a01b0316331461011a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610185565b6001600160a01b0381163b6102665760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b6064820152608401610185565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156102e7575f5ffd5b81356001600160a01b03811681146102fd575f5ffd5b939250505056fea2646970667358221220003d7f443094069cb023dc39fb36d6ba29922db6cd9b714ea95af972fc56405e64736f6c634300081c003300000000000000",
"storage": {
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x00000000000000000000000015d34aaf54267db7d7c367839aaf71a00a2c6a65",
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000059b670e9fa9d0a427751af201d676719a970857b"
}
},
"27": {
"address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82",
"code": "0x60806040523661001357610011610017565b005b6100115b61001f610168565b6001600160a01b0316330361015e5760606001600160e01b03195f35166364d3180d60e11b81016100595761005261019a565b9150610156565b63587086bd60e11b6001600160e01b0319821601610079576100526101ed565b63070d7c6960e41b6001600160e01b031982160161009957610052610231565b621eb96f60e61b6001600160e01b03198216016100b857610052610261565b63a39f25e560e01b6001600160e01b03198216016100d8576100526102a0565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101666102b3565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a46102c3565b5f6101b23660048184610668565b8101906101bf91906106aa565b90506101da8160405180602001604052805f8152505f6102cd565b505060408051602081019091525f815290565b60605f806101fe3660048184610668565b81019061020b91906106d7565b9150915061021b828260016102cd565b60405180602001604052805f8152509250505090565b606061023b6102c3565b5f6102493660048184610668565b81019061025691906106aa565b90506101da816102f8565b606061026b6102c3565b5f610274610168565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102aa6102c3565b5f61027461034f565b6101666102be61034f565b61035d565b3415610166575f5ffd5b6102d68361037b565b5f825111806102e25750805b156102f3576102f183836103ba565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610321610168565b604080516001600160a01b03928316815291841660208301520160405180910390a161034c816103e6565b50565b5f61035861048f565b905090565b365f5f375f5f365f845af43d5f5f3e808015610377573d5ff35b3d5ffd5b610384816104b6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103df83836040518060600160405280602781526020016107e76027913961054a565b9392505050565b6001600160a01b03811661044b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014d565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018b565b6001600160a01b0381163b6105235760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014d565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61046e565b60605f5f856001600160a01b031685604051610566919061079b565b5f60405180830381855af49150503d805f811461059e576040519150601f19603f3d011682016040523d82523d5f602084013e6105a3565b606091505b50915091506105b4868383876105be565b9695505050505050565b6060831561062c5782515f03610625576001600160a01b0385163b6106255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014d565b5081610636565b610636838361063e565b949350505050565b81511561064e5781518083602001fd5b8060405162461bcd60e51b815260040161014d91906107b1565b5f5f85851115610676575f5ffd5b83861115610682575f5ffd5b5050820193919092039150565b80356001600160a01b03811681146106a5575f5ffd5b919050565b5f602082840312156106ba575f5ffd5b6103df8261068f565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156106e8575f5ffd5b6106f18361068f565b9150602083013567ffffffffffffffff81111561070c575f5ffd5b8301601f8101851361071c575f5ffd5b803567ffffffffffffffff811115610736576107366106c3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610765576107656106c3565b60405281815282820160200187101561077c575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220861fd99925c9a795ce816251fa5b602392756b97b9314cad5a76d14fa0bea07364736f6c634300081c003300",
"storage": {
"0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788",
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001",
"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000322813fd9a801c5507c9de605d63cea4f2ce6c44"
}
},
"2": {
"address": "0x67d269191c92Caf3cD7723F116c85e6E9bf55933",
"code": "0x608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101df578063df595cb8146101f2578063eb5a4e8714610205578063fddbdefd14610218575f5ffd5b80639100674514610196578063950d806e146101b9578063ad5f2210146101cc575f5ffd5b806354fd4d50116100c357806354fd4d5014610124578063628806ef146101425780636bddfa1f14610155578063882a3b3814610175575f5ffd5b806306641201146100e9578063268959e5146100fe5780634f906cf914610111575b5f5ffd5b6100fc6100f7366004610dbd565b61022b565b005b6100fc61010c366004610e0e565b61034c565b6100fc61011f366004610e0e565b610427565b61012c6104ca565b6040516101399190610e3f565b60405180910390f35b6100fc610150366004610e74565b6104fa565b610168610163366004610e74565b610588565b6040516101399190610ed0565b610188610183366004610e0e565b6105b1565b604051610139929190610ee2565b6101a96101a4366004610e0e565b610712565b6040519015158152602001610139565b6100fc6101c7366004610dbd565b610782565b6101686101da366004610e74565b610893565b6101a96101ed366004610e0e565b610939565b6101a9610200366004610dbd565b61095a565b6100fc610213366004610e0e565b6109af565b610168610226366004610f44565b610a7d565b836102368133610712565b61025357604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102758585610abb565b6001600160a01b0387165f908152600484016020526040902090915061029b9082610ae8565b6102b85760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102db9082610aff565b505f81815260058301602052604090206102f59087610b0a565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161033b929190610f84565b60405180910390a350505050505050565b816103578133610712565b61037457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061039b82610b1e565b116103b9576040516310ce892b60e31b815260040160405180910390fd5b6103c38184610b0a565b6103e057604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b816104328133610712565b61044f57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104708184610b0a565b61048d5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac790602001610419565b60606104f57f76312e302e300000000000000000000000000000000000000000000000000006610b27565b905090565b6001600160a01b0381165f90815260016020526040902061051b8133610b0a565b6105385760405163bed8295f60e01b815260040160405180910390fd5b6105456002820133610b64565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f9081526001602052604090206060906105ab90610b78565b92915050565b6001600160a01b038083165f9081526001602090815260408083209385168352600490930190529081206060918291906105ea82610b1e565b90505f8167ffffffffffffffff81111561060657610606610fa7565b60405190808252806020026020018201604052801561062f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561064c5761064c610fa7565b604051908082528060200260200182016040528015610675578160200160208202803683370190505b5090505f5b83811015610704576106a861068f8683610b84565b606081901c9160a09190911b6001600160e01b03191690565b8483815181106106ba576106ba610fbb565b602002602001018484815181106106d3576106d3610fbb565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161067a565b509097909650945050505050565b6001600160a01b0382165f90815260016020526040812061073590600201610b1e565b5f0361075757816001600160a01b0316836001600160a01b03161490506105ab565b6001600160a01b0383165f90815260016020526040902061077b9060020183610b8f565b9392505050565b8361078d8133610712565b6107aa57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906107cc8585610abb565b6001600160a01b0387165f90815260048401602052604090209091506107f29082610ae8565b156108105760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206108339082610bb0565b505f818152600583016020526040902061084d9087610b64565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161033b929190610f84565b6001600160a01b0381165f9081526001602052604090206060906108b990600201610b1e565b5f03610911576040805160018082528183019092525f916020808301908036833701905050905082815f815181106108f3576108f3610fbb565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f9081526001602052604090206105ab90600201610b78565b919050565b6001600160a01b0382165f90815260016020526040812061077b9083610b8f565b5f6109658585610712565b806109a657506109a66109788484610abb565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610ae8565b95945050505050565b816109ba8133610712565b6109d757604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206109fb6002820184610b8f565b15610a195760405163130160e560e31b815260040160405180910390fd5b610a238184610b64565b610a40576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c90602001610419565b60605f610a8a8484610abb565b6001600160a01b0386165f90815260016020908152604080832084845260050190915290209091506109a690610b78565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561077b565b5f61077b8383610bbb565b5f61077b836001600160a01b038416610bbb565b5f6105ab825490565b60605f610b3383610c9e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61077b836001600160a01b038416610cc5565b60605f61077b83610d11565b5f61077b8383610d6a565b6001600160a01b0381165f908152600183016020526040812054151561077b565b5f61077b8383610cc5565b5f8181526001830160205260408120548015610c95575f610bdd600183610fcf565b85549091505f90610bf090600190610fcf565b9050818114610c4f575f865f018281548110610c0e57610c0e610fbb565b905f5260205f200154905080875f018481548110610c2e57610c2e610fbb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610c6057610c60610fee565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105ab565b5f9150506105ab565b5f60ff8216601f8111156105ab57604051632cd44ac360e21b815260040160405180910390fd5b5f818152600183016020526040812054610d0a57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105ab565b505f6105ab565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610d5e57602002820191905f5260205f20905b815481526020019060010190808311610d4a575b50505050509050919050565b5f825f018281548110610d7f57610d7f610fbb565b905f5260205f200154905092915050565b80356001600160a01b0381168114610934575f5ffd5b80356001600160e01b031981168114610934575f5ffd5b5f5f5f5f60808587031215610dd0575f5ffd5b610dd985610d90565b9350610de760208601610d90565b9250610df560408601610d90565b9150610e0360608601610da6565b905092959194509250565b5f5f60408385031215610e1f575f5ffd5b610e2883610d90565b9150610e3660208401610d90565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610e84575f5ffd5b61077b82610d90565b5f8151808452602084019350602083015f5b82811015610ec65781516001600160a01b0316865260209586019590910190600101610e9f565b5093949350505050565b602081525f61077b6020830184610e8d565b604081525f610ef46040830185610e8d565b82810360208401528084518083526020830191506020860192505f5b81811015610f385783516001600160e01b031916835260209384019390920191600101610f10565b50909695505050505050565b5f5f5f60608486031215610f56575f5ffd5b610f5f84610d90565b9250610f6d60208501610d90565b9150610f7b60408501610da6565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156105ab57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212205138500ca3c7de3b4f716056e14d380d984b3b127ee87718876d2d91dcf14c6d64736f6c634300081c003300000000",
"storage": {
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x00000000000000000000000000000000000000000000000000000000000000ff"
}
},
"31": {
"address": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1",
"code": "0x60806040523661001357610011610017565b005b6100115b61001f610168565b6001600160a01b0316330361015e5760606001600160e01b03195f35166364d3180d60e11b81016100595761005261019a565b9150610156565b63587086bd60e11b6001600160e01b0319821601610079576100526101ed565b63070d7c6960e41b6001600160e01b031982160161009957610052610231565b621eb96f60e61b6001600160e01b03198216016100b857610052610261565b63a39f25e560e01b6001600160e01b03198216016100d8576100526102a0565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101666102b3565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a46102c3565b5f6101b23660048184610668565b8101906101bf91906106aa565b90506101da8160405180602001604052805f8152505f6102cd565b505060408051602081019091525f815290565b60605f806101fe3660048184610668565b81019061020b91906106d7565b9150915061021b828260016102cd565b60405180602001604052805f8152509250505090565b606061023b6102c3565b5f6102493660048184610668565b81019061025691906106aa565b90506101da816102f8565b606061026b6102c3565b5f610274610168565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102aa6102c3565b5f61027461034f565b6101666102be61034f565b61035d565b3415610166575f5ffd5b6102d68361037b565b5f825111806102e25750805b156102f3576102f183836103ba565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610321610168565b604080516001600160a01b03928316815291841660208301520160405180910390a161034c816103e6565b50565b5f61035861048f565b905090565b365f5f375f5f365f845af43d5f5f3e808015610377573d5ff35b3d5ffd5b610384816104b6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103df83836040518060600160405280602781526020016107e76027913961054a565b9392505050565b6001600160a01b03811661044b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014d565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018b565b6001600160a01b0381163b6105235760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014d565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61046e565b60605f5f856001600160a01b031685604051610566919061079b565b5f60405180830381855af49150503d805f811461059e576040519150601f19603f3d011682016040523d82523d5f602084013e6105a3565b606091505b50915091506105b4868383876105be565b9695505050505050565b6060831561062c5782515f03610625576001600160a01b0385163b6106255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014d565b5081610636565b610636838361063e565b949350505050565b81511561064e5781518083602001fd5b8060405162461bcd60e51b815260040161014d91906107b1565b5f5f85851115610676575f5ffd5b83861115610682575f5ffd5b5050820193919092039150565b80356001600160a01b03811681146106a5575f5ffd5b919050565b5f602082840312156106ba575f5ffd5b6103df8261068f565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156106e8575f5ffd5b6106f18361068f565b9150602083013567ffffffffffffffff81111561070c575f5ffd5b8301601f8101851361071c575f5ffd5b803567ffffffffffffffff811115610736576107366106c3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610765576107656106c3565b60405281815282820160200187101561077c575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220861fd99925c9a795ce816251fa5b602392756b97b9314cad5a76d14fa0bea07364736f6c634300081c003300",
"storage": {
"0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788",
"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007a2088a1bfc9d81c55368ae168c2c02570cb814f",
"0x0000000000000000000000000000000000000000000000000000000000000033": "0x00000000000000000000000015d34aaf54267db7d7c367839aaf71a00a2c6a65",
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001"
}
},
"32": {
"address": "0x998abeb3E57409262aE5b751f60747921B33613E",
"code": "0x60806040523661001357610011610017565b005b6100115b61001f610168565b6001600160a01b0316330361015e5760606001600160e01b03195f35166364d3180d60e11b81016100595761005261019a565b9150610156565b63587086bd60e11b6001600160e01b0319821601610079576100526101ed565b63070d7c6960e41b6001600160e01b031982160161009957610052610231565b621eb96f60e61b6001600160e01b03198216016100b857610052610261565b63a39f25e560e01b6001600160e01b03198216016100d8576100526102a0565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101666102b3565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a46102c3565b5f6101b23660048184610668565b8101906101bf91906106aa565b90506101da8160405180602001604052805f8152505f6102cd565b505060408051602081019091525f815290565b60605f806101fe3660048184610668565b81019061020b91906106d7565b9150915061021b828260016102cd565b60405180602001604052805f8152509250505090565b606061023b6102c3565b5f6102493660048184610668565b81019061025691906106aa565b90506101da816102f8565b606061026b6102c3565b5f610274610168565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102aa6102c3565b5f61027461034f565b6101666102be61034f565b61035d565b3415610166575f5ffd5b6102d68361037b565b5f825111806102e25750805b156102f3576102f183836103ba565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610321610168565b604080516001600160a01b03928316815291841660208301520160405180910390a161034c816103e6565b50565b5f61035861048f565b905090565b365f5f375f5f365f845af43d5f5f3e808015610377573d5ff35b3d5ffd5b610384816104b6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103df83836040518060600160405280602781526020016107e76027913961054a565b9392505050565b6001600160a01b03811661044b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014d565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018b565b6001600160a01b0381163b6105235760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014d565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61046e565b60605f5f856001600160a01b031685604051610566919061079b565b5f60405180830381855af49150503d805f811461059e576040519150601f19603f3d011682016040523d82523d5f602084013e6105a3565b606091505b50915091506105b4868383876105be565b9695505050505050565b6060831561062c5782515f03610625576001600160a01b0385163b6106255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014d565b5081610636565b610636838361063e565b949350505050565b81511561064e5781518083602001fd5b8060405162461bcd60e51b815260040161014d91906107b1565b5f5f85851115610676575f5ffd5b83861115610682575f5ffd5b5050820193919092039150565b80356001600160a01b03811681146106a5575f5ffd5b919050565b5f602082840312156106ba575f5ffd5b6103df8261068f565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156106e8575f5ffd5b6106f18361068f565b9150602083013567ffffffffffffffff81111561070c575f5ffd5b8301601f8101851361071c575f5ffd5b803567ffffffffffffffff811115610736576107366106c3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610765576107656106c3565b60405281815282820160200187101561077c575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220861fd99925c9a795ce816251fa5b602392756b97b9314cad5a76d14fa0bea07364736f6c634300081c003300",
"storage": {
"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000f5059a5d33d5853360d16c683c16e67980206f36",
"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001",
"0x0000000000000000000000000000000000000000000000000000000000000032": "0x00000000000000000000000095401dc811bb5740090279ba06cfa8fcf6113778",
"0x0000000000000000000000000000000000000000000000000000000000000064": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000",
"0x0000000000000000000000000000000000000000000000000000000000000065": "0x000000000000000000000000000000000000000000084595161401484a000000",
"0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788"
}
},
"29": {
"address": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed",
"code": "0x60806040523661001357610011610017565b005b6100115b61001f610168565b6001600160a01b0316330361015e5760606001600160e01b03195f35166364d3180d60e11b81016100595761005261019a565b9150610156565b63587086bd60e11b6001600160e01b0319821601610079576100526101ed565b63070d7c6960e41b6001600160e01b031982160161009957610052610231565b621eb96f60e61b6001600160e01b03198216016100b857610052610261565b63a39f25e560
gitextract_oas6zffh/
├── .github/
│ ├── CODEOWNERS
│ ├── workflow-templates/
│ │ ├── build-prod-binary/
│ │ │ └── action.yml
│ │ └── publish-docker/
│ │ └── action.yml
│ └── workflows/
│ ├── CI.yml
│ ├── actions/
│ │ ├── cleanup-runner/
│ │ │ └── action.yml
│ │ └── setup-env/
│ │ └── action.yml
│ ├── enforce-pr-labels.yml
│ ├── release.yml
│ ├── task-build-operator.yml
│ ├── task-build-static-operator.yaml
│ ├── task-check-licenses.yml
│ ├── task-check-metadata.yml
│ ├── task-docker-ci.yml
│ ├── task-docker-release-validator-set-submitter.yml
│ ├── task-docker-release.yml
│ ├── task-e2e.yml
│ ├── task-foundry-tests.yml
│ ├── task-moonwall-tests.yml
│ ├── task-publish-binary.yml
│ ├── task-publish-runtime.yml
│ ├── task-rust-lint.yml
│ ├── task-rust-tests.yml
│ ├── task-storage-layout.yml
│ ├── task-ts-build.yml
│ ├── task-ts-lint.yml
│ ├── task-warm-sccache.yml
│ └── weekly-audit.yml
├── .gitignore
├── .gitmodules
├── CLAUDE.md
├── LICENSE
├── README.md
├── biome.json
├── contracts/
│ ├── .gitignore
│ ├── README.md
│ ├── VERSION
│ ├── config/
│ │ ├── anvil.json
│ │ ├── example.jsonc
│ │ ├── mainnet-ethereum.json
│ │ ├── stagenet-hoodi.json
│ │ └── testnet-hoodi.json
│ ├── deployments/
│ │ ├── anvil-agent-info.json
│ │ ├── anvil-rewards-info.json
│ │ ├── anvil.json
│ │ ├── hoodi.json
│ │ ├── metadata.json
│ │ ├── stagenet-hoodi-rewards-info.json
│ │ ├── stagenet-hoodi.json
│ │ ├── state-diff.checksum
│ │ └── state-diff.json
│ ├── foundry.toml
│ ├── script/
│ │ ├── deploy/
│ │ │ ├── Config.sol
│ │ │ ├── DeployBase.s.sol
│ │ │ ├── DeployImplementation.s.sol
│ │ │ ├── DeployLive.s.sol
│ │ │ ├── DeployLocal.s.sol
│ │ │ └── DeployParams.s.sol
│ │ ├── fixtures/
│ │ │ └── DataHavenServiceManagerBadLayout.sol
│ │ ├── transact/
│ │ │ ├── AllocateOperatorStake.s.sol
│ │ │ ├── SignUpOperatorBase.s.sol
│ │ │ └── SignUpValidator.s.sol
│ │ └── utils/
│ │ ├── Accounts.sol
│ │ ├── DHScriptStorage.s.sol
│ │ ├── ELScriptStorage.s.sol
│ │ ├── Logging.sol
│ │ ├── SnowbridgeScriptStorage.s.sol
│ │ └── ValidatorsUtils.sol
│ ├── scripts/
│ │ ├── check-storage-layout-negative.sh
│ │ └── check-storage-layout.sh
│ ├── src/
│ │ ├── DataHavenServiceManager.sol
│ │ ├── interfaces/
│ │ │ └── IDataHavenServiceManager.sol
│ │ └── libraries/
│ │ ├── DataHavenSnowbridgeMessages.sol
│ │ └── MerkleUtils.sol
│ ├── storage-snapshots/
│ │ ├── DataHavenServiceManager.storage.json
│ │ └── README.md
│ └── test/
│ ├── MessageEncoding.t.sol
│ ├── OperatorAddressMappings.t.sol
│ ├── RewardsSubmitter.t.sol
│ ├── Slashing.t.sol
│ ├── SnowbridgeIntegration.t.sol
│ ├── ValidatorSetSelection.t.sol
│ ├── ValidatorSetSubmitter.t.sol
│ ├── mocks/
│ │ ├── PermissionControllerMock.sol
│ │ ├── RewardsCoordinatorMock.sol
│ │ └── SnowbridgeGatewayMock.sol
│ ├── storage/
│ │ └── StorageLayout.t.sol
│ └── utils/
│ ├── AVSDeployer.sol
│ ├── ERC20FixedSupply.sol
│ ├── SnowbridgeAndAVSDeployer.sol
│ └── TestUtils.sol
├── deploy/
│ ├── README.md
│ ├── chainspecs/
│ │ ├── dh-testnet-spec-base.json
│ │ └── dh-testnet-spec-raw.json
│ ├── charts/
│ │ ├── backend/
│ │ │ ├── Chart.yaml
│ │ │ ├── README.md
│ │ │ ├── storagehub/
│ │ │ │ └── sh-mspbackend.yaml
│ │ │ ├── templates/
│ │ │ │ ├── _helpers.tpl
│ │ │ │ ├── configmap.yaml
│ │ │ │ ├── deployment.yaml
│ │ │ │ ├── ingress.yaml
│ │ │ │ ├── secret.yaml
│ │ │ │ ├── service.yaml
│ │ │ │ └── serviceaccount.yaml
│ │ │ └── values.yaml
│ │ ├── node/
│ │ │ ├── .gitignore
│ │ │ ├── .helmignore
│ │ │ ├── Chart.yaml
│ │ │ ├── README.md
│ │ │ ├── datahaven/
│ │ │ │ ├── dh-bootnode.yaml
│ │ │ │ └── dh-validator.yaml
│ │ │ ├── storagehub/
│ │ │ │ ├── sh-bspnode.yaml
│ │ │ │ ├── sh-fisherman.yaml
│ │ │ │ ├── sh-idxnode.yaml
│ │ │ │ └── sh-mspnode.yaml
│ │ │ ├── templates/
│ │ │ │ ├── _helpers.tpl
│ │ │ │ ├── customChainspecConfigmap.yaml
│ │ │ │ ├── customNodeKeySecret.yaml
│ │ │ │ ├── hpa.yaml
│ │ │ │ ├── ingress-per-replica.yaml
│ │ │ │ ├── ingress.yaml
│ │ │ │ ├── keys.yaml
│ │ │ │ ├── podDisruptionBudget.yaml
│ │ │ │ ├── service.yaml
│ │ │ │ ├── serviceAccount.yaml
│ │ │ │ ├── serviceMonitor.yaml
│ │ │ │ └── statefulset.yaml
│ │ │ └── values.yaml
│ │ └── relay/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── configs/
│ │ │ ├── beacon-relay.json
│ │ │ ├── beefy-relay.json
│ │ │ ├── execution-relay.json
│ │ │ └── solochain-relay.json
│ │ ├── snowbridge/
│ │ │ ├── dh-beacon-relay.yaml
│ │ │ ├── dh-beefy-relay.yaml
│ │ │ ├── dh-execution-relay.yaml
│ │ │ └── dh-solochain-relay.yaml
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── configmap.yaml
│ │ │ ├── cronjob.yml
│ │ │ ├── deployment.yaml
│ │ │ ├── pvc.yaml
│ │ │ ├── secret.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ └── values.yaml
│ └── environments/
│ ├── local/
│ │ ├── dh-beacon-relay.yaml
│ │ ├── dh-beefy-relay.yaml
│ │ ├── dh-bootnode.yaml
│ │ ├── dh-execution-relay.yaml
│ │ ├── dh-solochain-relay.yaml
│ │ ├── dh-validator.yaml
│ │ ├── sh-bspnode.yaml
│ │ ├── sh-fisherman.yaml
│ │ ├── sh-idxnode-db.yaml
│ │ ├── sh-idxnode.yaml
│ │ ├── sh-mspbackend.yaml
│ │ ├── sh-mspnode.yaml
│ │ └── traefik.yaml
│ ├── stagenet/
│ │ ├── dh-beacon-relay.yaml
│ │ ├── dh-beefy-relay.yaml
│ │ ├── dh-bootnode.yaml
│ │ ├── dh-execution-relay.yaml
│ │ ├── dh-solochain-relay.yaml
│ │ ├── dh-validator.yaml
│ │ ├── sh-bspnode.yaml
│ │ ├── sh-fisherman.yaml
│ │ ├── sh-idxnode-db.yaml
│ │ ├── sh-idxnode.yaml
│ │ ├── sh-mspbackend.yaml
│ │ └── sh-mspnode.yaml
│ └── testnet/
│ ├── dh-bootnode.yaml
│ └── dh-validator.yaml
├── docker/
│ ├── datahaven-build.Dockerfile
│ ├── datahaven-dev.Dockerfile
│ └── datahaven-production.Dockerfile
├── file_header.txt
├── operator/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── DOCKER-COMPOSE.md
│ ├── Dockerfile
│ ├── README.md
│ ├── benchmarking/
│ │ └── frame-weight-template.hbs
│ ├── docker-compose.yml
│ ├── node/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── build.rs
│ │ └── src/
│ │ ├── benchmarking.rs
│ │ ├── chain_spec/
│ │ │ ├── mainnet.rs
│ │ │ ├── mod.rs
│ │ │ ├── stagenet.rs
│ │ │ └── testnet.rs
│ │ ├── cli.rs
│ │ ├── client.rs
│ │ ├── command.rs
│ │ ├── config.rs
│ │ ├── consensus.rs
│ │ ├── eth.rs
│ │ ├── main.rs
│ │ ├── rpc.rs
│ │ └── service.rs
│ ├── pallets/
│ │ ├── datahaven-native-transfer/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ ├── ethereum-client/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── benchmark.md
│ │ │ ├── fixtures/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarking/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── config/
│ │ │ │ │ ├── altair.rs
│ │ │ │ │ ├── electra.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── debug_merkle.rs
│ │ │ │ ├── functions.rs
│ │ │ │ ├── impls.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── mock.rs
│ │ │ │ ├── mock_electra.rs
│ │ │ │ ├── tests.rs
│ │ │ │ ├── tests_electra.rs
│ │ │ │ ├── types.rs
│ │ │ │ └── weights.rs
│ │ │ └── tests/
│ │ │ ├── electra/
│ │ │ │ ├── execution-proof.json
│ │ │ │ ├── finalized-header-update.json
│ │ │ │ ├── inbound-message.json
│ │ │ │ ├── initial-checkpoint.json
│ │ │ │ ├── next-finalized-header-update.json
│ │ │ │ ├── next-sync-committee-update.json
│ │ │ │ └── sync-committee-update.json
│ │ │ └── fixtures/
│ │ │ ├── execution-proof.json
│ │ │ ├── finalized-header-update.json
│ │ │ ├── inbound-message.json
│ │ │ ├── initial-checkpoint.json
│ │ │ ├── next-finalized-header-update.json
│ │ │ ├── next-sync-committee-update.json
│ │ │ ├── sync-committee-update-period-0-newer.json
│ │ │ ├── sync-committee-update-period-0-older.json
│ │ │ ├── sync-committee-update-period-0.json
│ │ │ └── sync-committee-update.json
│ │ ├── external-validator-slashes/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ ├── external-validators/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── traits.rs
│ │ │ └── weights.rs
│ │ ├── external-validators-rewards/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── types.rs
│ │ │ └── weights.rs
│ │ ├── grandpa-benchmarking/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ └── lib.rs
│ │ ├── inbound-queue-v2/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── fixtures/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── lib.rs
│ │ │ │ └── register_token.rs
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── message_processors.rs
│ │ │ ├── mock.rs
│ │ │ ├── test.rs
│ │ │ └── weights.rs
│ │ ├── outbound-commitment-store/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── outbound-queue-v2/
│ │ │ ├── Cargo.toml
│ │ │ ├── runtime-api/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── api.rs
│ │ │ ├── benchmarking.rs
│ │ │ ├── fixture.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── process_message_impl.rs
│ │ │ ├── send_message_impl.rs
│ │ │ ├── test.rs
│ │ │ ├── types.rs
│ │ │ └── weights.rs
│ │ ├── proxy-genesis-companion/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── session-benchmarking/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ └── lib.rs
│ │ ├── system/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── runtime-api/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── README.md
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── api.rs
│ │ │ ├── benchmarking.rs
│ │ │ ├── lib.rs
│ │ │ ├── migration.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ └── weights.rs
│ │ └── system-v2/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ ├── runtime-api/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ ├── api.rs
│ │ ├── benchmarking.rs
│ │ ├── lib.rs
│ │ ├── mock.rs
│ │ ├── tests.rs
│ │ └── weights.rs
│ ├── precompiles/
│ │ ├── batch/
│ │ │ ├── Batch.sol
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── call-permit/
│ │ │ ├── CallPermit.sol
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── collective/
│ │ │ ├── Cargo.toml
│ │ │ ├── Collective.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── conviction-voting/
│ │ │ ├── Cargo.toml
│ │ │ ├── ConvictionVoting.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── datahaven-native-transfer/
│ │ │ ├── Cargo.toml
│ │ │ ├── DataHavenNativeTransfer.sol
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── erc20-balances/
│ │ │ ├── Cargo.toml
│ │ │ ├── ERC20.sol
│ │ │ ├── Permit.sol
│ │ │ └── src/
│ │ │ ├── eip2612.rs
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── identity/
│ │ │ ├── Cargo.toml
│ │ │ ├── Identity.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── precompile-registry/
│ │ │ ├── Cargo.toml
│ │ │ ├── PrecompileRegistry.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── preimage/
│ │ │ ├── Cargo.toml
│ │ │ ├── Preimage.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ ├── proxy/
│ │ │ ├── Cargo.toml
│ │ │ ├── Proxy.sol
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ └── tests.rs
│ │ └── referenda/
│ │ ├── Cargo.toml
│ │ ├── Referenda.sol
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── mock.rs
│ │ └── tests.rs
│ ├── primitives/
│ │ ├── bridge/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── snowbridge/
│ │ ├── beacon/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── bits.rs
│ │ │ ├── bls.rs
│ │ │ ├── config.rs
│ │ │ ├── lib.rs
│ │ │ ├── merkle_proof.rs
│ │ │ ├── receipt.rs
│ │ │ ├── serde_utils.rs
│ │ │ ├── ssz.rs
│ │ │ ├── types.rs
│ │ │ └── updates.rs
│ │ ├── bridge-hub-common/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── digest_item.rs
│ │ │ ├── lib.rs
│ │ │ ├── message_queue.rs
│ │ │ └── xcm_version.rs
│ │ ├── core/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ ├── src/
│ │ │ │ ├── lib.rs
│ │ │ │ ├── location.rs
│ │ │ │ ├── operating_mode.rs
│ │ │ │ ├── pricing.rs
│ │ │ │ ├── reward.rs
│ │ │ │ ├── ringbuffer.rs
│ │ │ │ ├── sparse_bitmap.rs
│ │ │ │ └── tests.rs
│ │ │ └── tests/
│ │ │ ├── fixtures/
│ │ │ │ └── packet.scale
│ │ │ └── mod.rs
│ │ ├── ethereum/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── header.rs
│ │ │ ├── lib.rs
│ │ │ ├── log.rs
│ │ │ ├── mpt.rs
│ │ │ └── receipt.rs
│ │ ├── inbound-queue/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock.rs
│ │ │ ├── tests.rs
│ │ │ ├── v1.rs
│ │ │ └── v2/
│ │ │ ├── converter.rs
│ │ │ ├── message.rs
│ │ │ ├── mod.rs
│ │ │ └── traits.rs
│ │ ├── merkle-tree/
│ │ │ ├── Cargo.toml
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── outbound-queue/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── v1/
│ │ │ │ ├── message.rs
│ │ │ │ └── mod.rs
│ │ │ └── v2/
│ │ │ ├── converter/
│ │ │ │ ├── convert.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── tests.rs
│ │ │ ├── delivery_receipt.rs
│ │ │ ├── exporter.rs
│ │ │ ├── message.rs
│ │ │ └── mod.rs
│ │ ├── test-utils/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ ├── mock_origin.rs
│ │ │ ├── mock_outbound_queue.rs
│ │ │ └── mock_xcm.rs
│ │ └── verification/
│ │ ├── Cargo.toml
│ │ ├── README.md
│ │ └── src/
│ │ └── lib.rs
│ ├── runtime/
│ │ ├── README.md
│ │ ├── common/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── benchmarking.rs
│ │ │ ├── constants.rs
│ │ │ ├── deal_with_fees.rs
│ │ │ ├── impl_on_charge_evm_transaction.rs
│ │ │ ├── inflation.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── rewards_adapter.rs
│ │ │ ├── safe_mode.rs
│ │ │ └── slashes_adapter.rs
│ │ ├── mainnet/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── configs/
│ │ │ │ │ ├── governance/
│ │ │ │ │ │ ├── councils.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── origins.rs
│ │ │ │ │ │ ├── referenda.rs
│ │ │ │ │ │ └── tracks.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── runtime_params.rs
│ │ │ │ │ └── storagehub/
│ │ │ │ │ ├── client.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── genesis_config_presets.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── precompiles.rs
│ │ │ │ └── weights/
│ │ │ │ ├── frame_system.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pallet_babe.rs
│ │ │ │ ├── pallet_balances.rs
│ │ │ │ ├── pallet_beefy_mmr.rs
│ │ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ │ ├── pallet_conviction_voting.rs
│ │ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ │ ├── pallet_evm.rs
│ │ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ │ ├── pallet_external_validators.rs
│ │ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ │ ├── pallet_file_system.rs
│ │ │ │ ├── pallet_grandpa.rs
│ │ │ │ ├── pallet_im_online.rs
│ │ │ │ ├── pallet_message_queue.rs
│ │ │ │ ├── pallet_migrations.rs
│ │ │ │ ├── pallet_mmr.rs
│ │ │ │ ├── pallet_multisig.rs
│ │ │ │ ├── pallet_nfts.rs
│ │ │ │ ├── pallet_parameters.rs
│ │ │ │ ├── pallet_payment_streams.rs
│ │ │ │ ├── pallet_preimage.rs
│ │ │ │ ├── pallet_proofs_dealer.rs
│ │ │ │ ├── pallet_proxy.rs
│ │ │ │ ├── pallet_randomness.rs
│ │ │ │ ├── pallet_referenda.rs
│ │ │ │ ├── pallet_safe_mode.rs
│ │ │ │ ├── pallet_scheduler.rs
│ │ │ │ ├── pallet_session.rs
│ │ │ │ ├── pallet_storage_providers.rs
│ │ │ │ ├── pallet_sudo.rs
│ │ │ │ ├── pallet_timestamp.rs
│ │ │ │ ├── pallet_transaction_payment.rs
│ │ │ │ ├── pallet_treasury.rs
│ │ │ │ ├── pallet_tx_pause.rs
│ │ │ │ ├── pallet_utility.rs
│ │ │ │ ├── pallet_whitelist.rs
│ │ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_system.rs
│ │ │ │ └── snowbridge_pallet_system_v2.rs
│ │ │ └── tests/
│ │ │ ├── common.rs
│ │ │ ├── fee_adjustment.rs
│ │ │ ├── governance/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── councils.rs
│ │ │ │ ├── integration.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── origins.rs
│ │ │ │ ├── proxy.rs
│ │ │ │ └── referenda.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── native_token_transfer.rs
│ │ │ ├── proxy.rs
│ │ │ ├── safe_mode_tx_pause.rs
│ │ │ └── treasury.rs
│ │ ├── stagenet/
│ │ │ ├── Cargo.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── configs/
│ │ │ │ │ ├── governance/
│ │ │ │ │ │ ├── councils.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── origins.rs
│ │ │ │ │ │ ├── referenda.rs
│ │ │ │ │ │ └── tracks.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── runtime_params.rs
│ │ │ │ │ └── storagehub/
│ │ │ │ │ ├── client.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── genesis_config_presets.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── precompiles.rs
│ │ │ │ └── weights/
│ │ │ │ ├── frame_system.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pallet_babe.rs
│ │ │ │ ├── pallet_balances.rs
│ │ │ │ ├── pallet_beefy_mmr.rs
│ │ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ │ ├── pallet_conviction_voting.rs
│ │ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ │ ├── pallet_evm.rs
│ │ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ │ ├── pallet_external_validators.rs
│ │ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ │ ├── pallet_file_system.rs
│ │ │ │ ├── pallet_grandpa.rs
│ │ │ │ ├── pallet_im_online.rs
│ │ │ │ ├── pallet_message_queue.rs
│ │ │ │ ├── pallet_migrations.rs
│ │ │ │ ├── pallet_mmr.rs
│ │ │ │ ├── pallet_multisig.rs
│ │ │ │ ├── pallet_nfts.rs
│ │ │ │ ├── pallet_parameters.rs
│ │ │ │ ├── pallet_payment_streams.rs
│ │ │ │ ├── pallet_preimage.rs
│ │ │ │ ├── pallet_proofs_dealer.rs
│ │ │ │ ├── pallet_proxy.rs
│ │ │ │ ├── pallet_randomness.rs
│ │ │ │ ├── pallet_referenda.rs
│ │ │ │ ├── pallet_safe_mode.rs
│ │ │ │ ├── pallet_scheduler.rs
│ │ │ │ ├── pallet_session.rs
│ │ │ │ ├── pallet_storage_providers.rs
│ │ │ │ ├── pallet_sudo.rs
│ │ │ │ ├── pallet_timestamp.rs
│ │ │ │ ├── pallet_transaction_payment.rs
│ │ │ │ ├── pallet_treasury.rs
│ │ │ │ ├── pallet_tx_pause.rs
│ │ │ │ ├── pallet_utility.rs
│ │ │ │ ├── pallet_whitelist.rs
│ │ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ │ ├── snowbridge_pallet_system.rs
│ │ │ │ └── snowbridge_pallet_system_v2.rs
│ │ │ └── tests/
│ │ │ ├── common.rs
│ │ │ ├── fee_adjustment.rs
│ │ │ ├── governance/
│ │ │ │ ├── benchmarks.rs
│ │ │ │ ├── councils.rs
│ │ │ │ ├── integration.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── origins.rs
│ │ │ │ ├── proxy.rs
│ │ │ │ └── referenda.rs
│ │ │ ├── lib.rs
│ │ │ ├── migrations.rs
│ │ │ ├── native_token_transfer.rs
│ │ │ ├── proxy.rs
│ │ │ ├── safe_mode_tx_pause.rs
│ │ │ ├── snowbridge_message_processor.rs
│ │ │ └── treasury.rs
│ │ └── testnet/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ ├── src/
│ │ │ ├── benchmarks.rs
│ │ │ ├── configs/
│ │ │ │ ├── governance/
│ │ │ │ │ ├── councils.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── origins.rs
│ │ │ │ │ ├── referenda.rs
│ │ │ │ │ └── tracks.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── runtime_params.rs
│ │ │ │ └── storagehub/
│ │ │ │ ├── client.rs
│ │ │ │ └── mod.rs
│ │ │ ├── genesis_config_presets.rs
│ │ │ ├── lib.rs
│ │ │ ├── precompiles.rs
│ │ │ └── weights/
│ │ │ ├── frame_system.rs
│ │ │ ├── mod.rs
│ │ │ ├── pallet_babe.rs
│ │ │ ├── pallet_balances.rs
│ │ │ ├── pallet_beefy_mmr.rs
│ │ │ ├── pallet_collective_technical_committee.rs
│ │ │ ├── pallet_collective_treasury_council.rs
│ │ │ ├── pallet_conviction_voting.rs
│ │ │ ├── pallet_datahaven_native_transfer.rs
│ │ │ ├── pallet_evm.rs
│ │ │ ├── pallet_external_validator_slashes.rs
│ │ │ ├── pallet_external_validators.rs
│ │ │ ├── pallet_external_validators_rewards.rs
│ │ │ ├── pallet_file_system.rs
│ │ │ ├── pallet_grandpa.rs
│ │ │ ├── pallet_identity.rs
│ │ │ ├── pallet_im_online.rs
│ │ │ ├── pallet_message_queue.rs
│ │ │ ├── pallet_migrations.rs
│ │ │ ├── pallet_mmr.rs
│ │ │ ├── pallet_multisig.rs
│ │ │ ├── pallet_nfts.rs
│ │ │ ├── pallet_parameters.rs
│ │ │ ├── pallet_payment_streams.rs
│ │ │ ├── pallet_preimage.rs
│ │ │ ├── pallet_proofs_dealer.rs
│ │ │ ├── pallet_proxy.rs
│ │ │ ├── pallet_randomness.rs
│ │ │ ├── pallet_referenda.rs
│ │ │ ├── pallet_safe_mode.rs
│ │ │ ├── pallet_scheduler.rs
│ │ │ ├── pallet_session.rs
│ │ │ ├── pallet_storage_providers.rs
│ │ │ ├── pallet_sudo.rs
│ │ │ ├── pallet_timestamp.rs
│ │ │ ├── pallet_transaction_payment.rs
│ │ │ ├── pallet_treasury.rs
│ │ │ ├── pallet_tx_pause.rs
│ │ │ ├── pallet_utility.rs
│ │ │ ├── pallet_whitelist.rs
│ │ │ ├── snowbridge_pallet_ethereum_client.rs
│ │ │ ├── snowbridge_pallet_inbound_queue_v2.rs
│ │ │ ├── snowbridge_pallet_outbound_queue_v2.rs
│ │ │ ├── snowbridge_pallet_system.rs
│ │ │ └── snowbridge_pallet_system_v2.rs
│ │ └── tests/
│ │ ├── common.rs
│ │ ├── fee_adjustment.rs
│ │ ├── governance/
│ │ │ ├── benchmarks.rs
│ │ │ ├── councils.rs
│ │ │ ├── integration.rs
│ │ │ ├── mod.rs
│ │ │ ├── origins.rs
│ │ │ ├── proxy.rs
│ │ │ └── referenda.rs
│ │ ├── lib.rs
│ │ ├── migrations.rs
│ │ ├── native_token_transfer.rs
│ │ ├── proxy.rs
│ │ ├── safe_mode_tx_pause.rs
│ │ └── treasury.rs
│ ├── rust-toolchain.toml
│ └── scripts/
│ ├── build-runtime-srtool.sh
│ ├── docker-entrypoint.sh
│ ├── docker-healthcheck.sh
│ ├── docker-prepare.sh
│ ├── run-benchmarks.sh
│ ├── sort-cargo-deps.sh
│ ├── test_message_encoding.sh
│ └── verify-licenses.sh
├── specs/
│ ├── validator-set-selection/
│ │ └── validator-set-selection.md
│ └── validator-set-submission/
│ └── validator-set-submission.md
├── taplo.toml
├── test/
│ ├── .bun-version
│ ├── .dockerignore
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .papi/
│ │ ├── descriptors/
│ │ │ ├── .gitignore
│ │ │ └── package.json
│ │ ├── metadata/
│ │ │ └── datahaven.scale
│ │ └── polkadot-api.json
│ ├── README.md
│ ├── biome.json
│ ├── bunfig.toml
│ ├── cli/
│ │ ├── handlers/
│ │ │ ├── common/
│ │ │ │ ├── checks.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── kubernetes.ts
│ │ │ ├── contracts/
│ │ │ │ ├── README.md
│ │ │ │ ├── beefy-checkpoint.ts
│ │ │ │ ├── checks.ts
│ │ │ │ ├── deploy.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── rewards-origin.ts
│ │ │ │ ├── status.ts
│ │ │ │ ├── update-metadata.ts
│ │ │ │ ├── upgrade.ts
│ │ │ │ └── verify.ts
│ │ │ ├── deploy/
│ │ │ │ ├── cleanup.ts
│ │ │ │ ├── contracts.ts
│ │ │ │ ├── datahaven.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kurtosis.ts
│ │ │ │ ├── parameters.ts
│ │ │ │ ├── relayer.ts
│ │ │ │ ├── storagehub.ts
│ │ │ │ └── validator.ts
│ │ │ ├── exec/
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── launch/
│ │ │ │ ├── contracts.ts
│ │ │ │ ├── datahaven.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kurtosis.ts
│ │ │ │ ├── parameters.ts
│ │ │ │ ├── relayer.ts
│ │ │ │ ├── storagehub.ts
│ │ │ │ ├── summary.ts
│ │ │ │ └── validator.ts
│ │ │ └── stop/
│ │ │ └── index.ts
│ │ └── index.ts
│ ├── configs/
│ │ ├── contracts/
│ │ │ └── config.ts
│ │ ├── kurtosis/
│ │ │ └── minimal.yaml
│ │ ├── parameters/
│ │ │ └── datahaven-parameters.json
│ │ ├── snowbridge/
│ │ │ ├── genesis.json
│ │ │ ├── local/
│ │ │ │ ├── beacon-relay.json
│ │ │ │ ├── beefy-relay.json
│ │ │ │ ├── execution-relay.json
│ │ │ │ └── solochain-relay.json
│ │ │ ├── stagenet/
│ │ │ │ ├── beacon-relay.json
│ │ │ │ ├── beefy-relay.json
│ │ │ │ ├── execution-relay.json
│ │ │ │ └── solochain-relay.json
│ │ │ └── tanssi-examples/
│ │ │ ├── beacon-relay.json
│ │ │ ├── beefy-relay.json
│ │ │ ├── dump-initial-checkpoint.json
│ │ │ ├── execution-relay-asset-hub.json
│ │ │ ├── execution-relay.json
│ │ │ ├── genesis.json
│ │ │ ├── snowbridge_contracts.json
│ │ │ ├── substrate-relay-asset-hub.json
│ │ │ ├── substrate-relay-primary.json
│ │ │ ├── substrate-relay-secondary.json
│ │ │ └── symbiotic_contracts.json
│ │ └── validator-set.json
│ ├── contract-bindings/
│ │ ├── generated.ts
│ │ └── index.ts
│ ├── docker/
│ │ └── crossbuild-mac-libpq.dockerfile
│ ├── docs/
│ │ ├── E2E_FRAMEWORK_OVERVIEW.md
│ │ └── deployment.md
│ ├── e2e/
│ │ ├── framework/
│ │ │ ├── connectors.ts
│ │ │ ├── index.ts
│ │ │ ├── manager.ts
│ │ │ ├── submitter.ts
│ │ │ ├── suite.ts
│ │ │ └── validators.ts
│ │ └── suites/
│ │ ├── native-token-transfer.test.ts
│ │ ├── rewards-message.test.ts
│ │ ├── slash.test.ts
│ │ ├── storagehub.test.ts
│ │ └── validator-set-update.test.ts
│ ├── launcher/
│ │ ├── contracts.ts
│ │ ├── datahaven.ts
│ │ ├── index.ts
│ │ ├── kurtosis.ts
│ │ ├── network/
│ │ │ └── index.ts
│ │ ├── parameters.ts
│ │ ├── relayers.ts
│ │ ├── storagehub-docker.ts
│ │ ├── types/
│ │ │ ├── index.ts
│ │ │ └── launchedNetwork.ts
│ │ ├── utils/
│ │ │ ├── checks.ts
│ │ │ ├── constants.ts
│ │ │ └── index.ts
│ │ └── validators.ts
│ ├── moonwall/
│ │ ├── contracts/
│ │ │ └── src/
│ │ │ ├── AccessListHelper.sol
│ │ │ ├── BloatedContract.sol
│ │ │ ├── BlockVariables.sol
│ │ │ ├── CallBatchFromConstructor.sol
│ │ │ ├── CallForwarder.sol
│ │ │ ├── ECContracts.sol
│ │ │ ├── EventEmitter.sol
│ │ │ ├── FailingConstructor.sol
│ │ │ ├── Fibonacci.sol
│ │ │ ├── HasherChecker.sol
│ │ │ ├── Incrementor.sol
│ │ │ ├── Looper.sol
│ │ │ ├── MultiplyBy7.sol
│ │ │ ├── SelfDestruct.sol
│ │ │ ├── SimpleContractFactory.sol
│ │ │ ├── StateOverrideTest.sol
│ │ │ ├── StorageLoop.sol
│ │ │ ├── SubCallOOG.sol
│ │ │ └── dancun/
│ │ │ ├── ProxySuicide.sol
│ │ │ └── TransientStorage.sol
│ │ ├── helpers/
│ │ │ ├── block.ts
│ │ │ ├── constants.ts
│ │ │ ├── contracts.ts
│ │ │ ├── eth-transactions.ts
│ │ │ ├── evm.ts
│ │ │ ├── expect.ts
│ │ │ ├── fees.ts
│ │ │ ├── index.ts
│ │ │ ├── modexp.ts
│ │ │ ├── parameters.ts
│ │ │ ├── precompile-addresses.ts
│ │ │ ├── precompile-contract-calls.ts
│ │ │ └── transactions.ts
│ │ └── suites/
│ │ └── dev/
│ │ ├── common/
│ │ │ ├── test-block/
│ │ │ │ ├── test-block-1.ts
│ │ │ │ ├── test-block-2.ts
│ │ │ │ ├── test-block-gas.ts
│ │ │ │ ├── test-block-genesis.ts
│ │ │ │ └── test-block-safe-mode.ts
│ │ │ ├── test-contract/
│ │ │ │ └── test-contract-creation.ts
│ │ │ ├── test-precompile/
│ │ │ │ └── test-precompile-batch.ts
│ │ │ └── test-proxy/
│ │ │ └── test-proxy-balance.ts
│ │ └── stagenet/
│ │ ├── balance/
│ │ │ ├── test-balance-existential.ts
│ │ │ ├── test-balance-extrinsics.ts
│ │ │ ├── test-balance-genesis.ts
│ │ │ └── test-balance-transfer.ts
│ │ ├── contract/
│ │ │ ├── test-contract-delegate-call.ts
│ │ │ ├── test-contract-error.ts
│ │ │ ├── test-contract-event.ts
│ │ │ ├── test-contract-evm-limits.ts
│ │ │ ├── test-contract-fibonacci.ts
│ │ │ ├── test-contract-incr-loop.ts
│ │ │ ├── test-contract-loop-cost.ts
│ │ │ ├── test-contract-methods.ts
│ │ │ ├── test-contract-variables.ts
│ │ │ ├── test-eip-6780.ts
│ │ │ └── test-eip1153.ts
│ │ ├── eth-call/
│ │ │ └── test-eth-call-state-override.ts
│ │ ├── eth-fee/
│ │ │ ├── test-eth-fee-history.ts
│ │ │ ├── test-eth-paysFee.ts
│ │ │ └── test-eth-txn-weights.ts
│ │ ├── eth-pool/
│ │ │ ├── test-eth-pool-discard.ts
│ │ │ ├── test-eth-pool-error.ts
│ │ │ ├── test-eth-pool-multiple.ts
│ │ │ ├── test-eth-pool-nonce-future.ts
│ │ │ └── test-eth-pool-resubmit-txn.ts
│ │ ├── eth-rpc/
│ │ │ ├── test-eth-rpc-constants.ts
│ │ │ ├── test-eth-rpc-deprecated.ts
│ │ │ ├── test-eth-rpc-log-filtering.ts
│ │ │ ├── test-eth-rpc-transaction-receipt.ts
│ │ │ ├── test-eth-rpc-tx-index.ts
│ │ │ └── test-eth-rpc-version.ts
│ │ ├── eth-tx/
│ │ │ ├── test-eth-tx-access-list.ts
│ │ │ ├── test-eth-tx-native-transfer.ts
│ │ │ ├── test-eth-tx-size.ts
│ │ │ ├── test-eth-tx-types.ts
│ │ │ └── test-test-tx-nonce.ts
│ │ ├── ethers/
│ │ │ └── test-ethers.ts
│ │ ├── evm/
│ │ │ ├── test-pallet-evm-overflow.ts
│ │ │ └── test-pallet-evm-transfer.ts
│ │ ├── filter/
│ │ │ ├── test-filter-api-creation.ts
│ │ │ ├── test-filter-api-pending.ts
│ │ │ └── test-filter-api-polling.ts
│ │ ├── gas/
│ │ │ ├── test-gas-contract-creation.ts
│ │ │ ├── test-gas-estimation-allcontracts.ts
│ │ │ ├── test-gas-estimation-contracts.ts
│ │ │ ├── test-gas-estimation-multiply.ts
│ │ │ └── test-gas-estimation-subcall-oog.ts
│ │ ├── multisig/
│ │ │ └── test-multisigs.ts
│ │ ├── node-rpc/
│ │ │ └── test-node-rpc-peer.ts
│ │ ├── polkadot-js/
│ │ │ ├── test-polkadot-api.ts
│ │ │ └── test-polkadot-chain-info.ts
│ │ ├── precompile/
│ │ │ ├── test-precompile-blake2.ts
│ │ │ ├── test-precompile-bn128-bounds.ts
│ │ │ ├── test-precompile-bn128add.ts
│ │ │ ├── test-precompile-bn128mul.ts
│ │ │ ├── test-precompile-bn128pairing.ts
│ │ │ ├── test-precompile-ecrecover.ts
│ │ │ ├── test-precompile-erc20-overflow.ts
│ │ │ ├── test-precompile-erc20.ts
│ │ │ ├── test-precompile-identity.ts
│ │ │ ├── test-precompile-identity10.ts
│ │ │ ├── test-precompile-identity11.ts
│ │ │ ├── test-precompile-identity12.ts
│ │ │ ├── test-precompile-identity13.ts
│ │ │ ├── test-precompile-identity14.ts
│ │ │ ├── test-precompile-identity2.ts
│ │ │ ├── test-precompile-identity3.ts
│ │ │ ├── test-precompile-identity4.ts
│ │ │ ├── test-precompile-identity5.ts
│ │ │ ├── test-precompile-identity6.ts
│ │ │ ├── test-precompile-identity7.ts
│ │ │ ├── test-precompile-identity8.ts
│ │ │ ├── test-precompile-identity9.ts
│ │ │ ├── test-precompile-modexp.ts
│ │ │ ├── test-precompile-preimage.ts
│ │ │ ├── test-precompile-proxy.ts
│ │ │ ├── test-precompile-ripemd160.ts
│ │ │ └── test-precompile-sha3fips.ts
│ │ ├── proxy/
│ │ │ └── test-proxy.ts
│ │ ├── receipt/
│ │ │ ├── test-receipt-revert.ts
│ │ │ └── test-receipt.ts
│ │ ├── storage-growth/
│ │ │ └── test-evm-store-storage-growth.ts
│ │ ├── subscription/
│ │ │ ├── test-subscription-logs.ts
│ │ │ ├── test-subscription-logs2.ts
│ │ │ ├── test-subscription-pending.ts
│ │ │ └── test-subscription.ts
│ │ ├── sudo/
│ │ │ └── test-sudo.ts
│ │ └── txpool/
│ │ ├── test-txpool-future.ts
│ │ └── test-txpool-pending.ts
│ ├── moonwall.config.json
│ ├── package.json
│ ├── resources/
│ │ └── datahaven-integration-test-flow.md
│ ├── scripts/
│ │ ├── cargo-crossbuild.ts
│ │ ├── check-generated-state.ts
│ │ ├── compile-contracts.sh
│ │ ├── compile-contracts.ts
│ │ ├── contracts-checksum.ts
│ │ ├── deploy-contracts.ts
│ │ ├── fund-providers.ts
│ │ ├── fund-validators.ts
│ │ ├── generate-contracts.ts
│ │ ├── register-providers.ts
│ │ ├── send-txn.ts
│ │ ├── set-datahaven-parameters.ts
│ │ ├── setup-validators.ts
│ │ ├── test-parallel.ts
│ │ └── update-validator-set.ts
│ ├── tools/
│ │ └── validator-set-submitter/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── chain.ts
│ │ ├── config.ts
│ │ ├── config.yml
│ │ ├── main.ts
│ │ ├── metrics.ts
│ │ └── submitter.ts
│ ├── tsconfig.json
│ ├── utils/
│ │ ├── anvil.ts
│ │ ├── blockscout.ts
│ │ ├── constants.ts
│ │ ├── contracts/
│ │ │ └── versioning.ts
│ │ ├── contracts.ts
│ │ ├── docker.ts
│ │ ├── events.ts
│ │ ├── index.ts
│ │ ├── input.ts
│ │ ├── kurtosis.ts
│ │ ├── logger.ts
│ │ ├── papi.ts
│ │ ├── parameters.ts
│ │ ├── parser.ts
│ │ ├── rpc.ts
│ │ ├── service-mappings.ts
│ │ ├── shell.ts
│ │ ├── types.ts
│ │ ├── validators.ts
│ │ ├── viem.ts
│ │ └── waits.ts
│ └── wagmi.config.ts
└── tools/
├── .nvmrc
├── README.md
├── github/
│ ├── generate-release-body.ts
│ ├── generate-runtimes-body.ts
│ └── github-utils.ts
├── package.json
└── tsconfig.json
Showing preview only (760K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8928 symbols across 480 files)
FILE: operator/node/build.rs
function main (line 19) | fn main() {
FILE: operator/node/src/benchmarking.rs
type RemarkBuilder (line 37) | pub struct RemarkBuilder<RuntimeApi> {
function new (line 43) | pub fn new(client: Arc<FullClient<RuntimeApi>>) -> Self {
function pallet (line 49) | fn pallet(&self) -> &str {
function extrinsic (line 53) | fn extrinsic(&self) -> &str {
function build (line 57) | fn build(&self, nonce: u32) -> std::result::Result<OpaqueExtrinsic, &'st...
type TransferKeepAliveBuilder (line 73) | pub struct TransferKeepAliveBuilder<RuntimeApi> {
function new (line 81) | pub fn new(client: Arc<FullClient<RuntimeApi>>, dest: AccountId, value: ...
function pallet (line 91) | fn pallet(&self) -> &str {
function extrinsic (line 95) | fn extrinsic(&self) -> &str {
function build (line 99) | fn build(&self, nonce: u32) -> std::result::Result<OpaqueExtrinsic, &'st...
function create_benchmark_extrinsic (line 119) | pub fn create_benchmark_extrinsic<RuntimeApi>(
function inherent_benchmark_data (line 182) | pub fn inherent_benchmark_data() -> Result<InherentData> {
FILE: operator/node/src/chain_spec/mainnet.rs
constant EVM_CHAIN_ID (line 22) | const EVM_CHAIN_ID: u64 = 55930;
constant SS58_FORMAT (line 23) | const SS58_FORMAT: u16 = EVM_CHAIN_ID as u16;
constant TOKEN_DECIMALS (line 24) | const TOKEN_DECIMALS: u8 = 18;
constant TOKEN_SYMBOL (line 25) | const TOKEN_SYMBOL: &str = "HAVE";
function development_chain_spec (line 27) | pub fn development_chain_spec() -> Result<ChainSpec, String> {
function local_chain_spec (line 47) | pub fn local_chain_spec() -> Result<ChainSpec, String> {
FILE: operator/node/src/chain_spec/mod.rs
type ChainSpec (line 22) | pub type ChainSpec = sc_service::GenericChainSpec;
type NetworkType (line 26) | pub trait NetworkType {
method is_stagenet (line 28) | fn is_stagenet(&self) -> bool;
method is_testnet (line 31) | fn is_testnet(&self) -> bool;
method is_mainnet (line 34) | fn is_mainnet(&self) -> bool;
method is_dev (line 37) | fn is_dev(&self) -> bool;
method is_dev (line 41) | fn is_dev(&self) -> bool {
method is_stagenet (line 45) | fn is_stagenet(&self) -> bool {
method is_testnet (line 49) | fn is_testnet(&self) -> bool {
method is_mainnet (line 53) | fn is_mainnet(&self) -> bool {
FILE: operator/node/src/chain_spec/stagenet.rs
constant EVM_CHAIN_ID (line 22) | const EVM_CHAIN_ID: u64 = 55932;
constant SS58_FORMAT (line 23) | const SS58_FORMAT: u16 = EVM_CHAIN_ID as u16;
constant TOKEN_DECIMALS (line 24) | const TOKEN_DECIMALS: u8 = 18;
constant TOKEN_SYMBOL (line 25) | const TOKEN_SYMBOL: &str = "STAGE";
function development_chain_spec (line 27) | pub fn development_chain_spec() -> Result<ChainSpec, String> {
function local_chain_spec (line 47) | pub fn local_chain_spec() -> Result<ChainSpec, String> {
FILE: operator/node/src/chain_spec/testnet.rs
constant EVM_CHAIN_ID (line 22) | const EVM_CHAIN_ID: u64 = 55931;
constant SS58_FORMAT (line 23) | const SS58_FORMAT: u16 = EVM_CHAIN_ID as u16;
constant TOKEN_DECIMALS (line 24) | const TOKEN_DECIMALS: u8 = 18;
constant TOKEN_SYMBOL (line 25) | const TOKEN_SYMBOL: &str = "MOCK";
function development_chain_spec (line 27) | pub fn development_chain_spec() -> Result<ChainSpec, String> {
function local_chain_spec (line 47) | pub fn local_chain_spec() -> Result<ChainSpec, String> {
FILE: operator/node/src/cli.rs
type Sealing (line 35) | pub enum Sealing {
type Cli (line 44) | pub struct Cli {
type Subcommand (line 92) | pub enum Subcommand {
type ProviderType (line 128) | pub enum ProviderType {
method deserialize (line 136) | fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
type StorageLayer (line 154) | pub enum StorageLayer {
method deserialize (line 162) | fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
type ProviderConfigurations (line 181) | pub struct ProviderConfigurations {
method provider_options (line 525) | pub fn provider_options(&self) -> ProviderOptions {
type IndexerConfigurations (line 704) | pub struct IndexerConfigurations {
method indexer_options (line 730) | pub fn indexer_options(&self) -> Option<IndexerOptions> {
type FishermanFiltering (line 747) | pub enum FishermanFiltering {
type FishermanOrdering (line 757) | pub enum FishermanOrdering {
type FishermanConfigurations (line 766) | pub struct FishermanConfigurations {
method fisherman_options (line 845) | pub fn fisherman_options(&self) -> Option<FishermanOptions> {
FILE: operator/node/src/client.rs
type FullBackend (line 25) | pub type FullBackend<B> = sc_service::TFullBackend<B>;
type FullClient (line 27) | pub type FullClient<B, RA, HF> = sc_service::TFullClient<B, RA, WasmExec...
type _BaseRuntimeApiCollection (line 30) | pub trait _BaseRuntimeApiCollection<Block: BlockT>:
type _RuntimeApiCollection (line 53) | pub trait _RuntimeApiCollection<Block: BlockT, Balance: Codec + MaybeDis...
FILE: operator/node/src/command.rs
type ProviderOptions (line 44) | pub struct ProviderOptions {
type RoleOptions (line 108) | pub enum RoleOptions {
method impl_name (line 116) | fn impl_name() -> String {
method impl_version (line 120) | fn impl_version() -> String {
method description (line 124) | fn description() -> String {
method author (line 128) | fn author() -> String {
method support_url (line 132) | fn support_url() -> String {
method copyright_start_year (line 136) | fn copyright_start_year() -> i32 {
method load_spec (line 140) | fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, ...
function run (line 226) | pub fn run() -> sc_cli::Result<()> {
FILE: operator/node/src/config.rs
type Config (line 29) | pub struct Config {
function read_config (line 35) | pub fn read_config(path: &str) -> Option<Config> {
FILE: operator/node/src/consensus.rs
type BabeConsensusDataProvider (line 23) | pub struct BabeConsensusDataProvider {}
method new (line 27) | pub fn new() -> Self {
method create_digest (line 36) | fn create_digest(
function from (line 52) | fn from(provider: BabeConsensusDataProvider) -> Self {
FILE: operator/node/src/eth.rs
type DefaultEthConfig (line 41) | pub struct DefaultEthConfig<C, BE>(std::marker::PhantomData<(C, BE)>);
type EstimateGasAdapter (line 48) | type EstimateGasAdapter = ();
type RuntimeStorageOverride (line 49) | type RuntimeStorageOverride =
type BackendType (line 55) | pub enum BackendType {
type EthConfiguration (line 65) | pub struct EthConfiguration {
type FrontierPartialComponents (line 116) | pub struct FrontierPartialComponents {
function new_frontier_partial (line 122) | pub fn new_frontier_partial(
type EthCompatRuntimeApiCollection (line 133) | pub trait EthCompatRuntimeApiCollection<Block: BlockT>:
type FrontierTasksParams (line 147) | pub struct FrontierTasksParams<B, RA, HF>
function spawn_frontier_tasks (line 168) | pub async fn spawn_frontier_tasks<B, RA, HF>(
FILE: operator/node/src/main.rs
function main (line 32) | fn main() -> sc_cli::Result<()> {
FILE: operator/node/src/rpc.rs
type BeefyDeps (line 62) | pub struct BeefyDeps<AuthorityId: AuthorityIdBound> {
type FullDeps (line 72) | pub struct FullDeps<P, B, AuthorityId: AuthorityIdBound, A: ChainApi, FL...
function create_full (line 115) | pub fn create_full<P, BE, AuthorityId, A, FL, FSH, Runtime>(
FILE: operator/node/src/service.rs
type FullClient (line 83) | pub(crate) type FullClient<RuntimeApi> = StorageHubClient<RuntimeApi>;
type FullBackend (line 85) | type FullBackend = sc_service::TFullBackend<Block>;
type FullSelectChain (line 86) | type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
type FullGrandpaBlockImport (line 87) | type FullGrandpaBlockImport<RuntimeApi> = sc_consensus_grandpa::GrandpaB...
type FullBeefyBlockImport (line 93) | type FullBeefyBlockImport<InnerBlockImport, AuthorityId, RuntimeApi> =
constant GRANDPA_JUSTIFICATION_PERIOD (line 104) | const GRANDPA_JUSTIFICATION_PERIOD: u32 = 512;
type FullRuntimeApi (line 111) | pub(crate) trait FullRuntimeApi:
type Service (line 151) | pub type Service<RuntimeApi> = sc_service::PartialComponents<
type StorageEnableClient (line 185) | pub(crate) type StorageEnableClient<Runtime> =
function frontier_database_dir (line 188) | pub fn frontier_database_dir(config: &Configuration, path: &str) -> std:...
function open_frontier_backend (line 196) | pub fn open_frontier_backend<C, BE>(
function build_babe_inherent_providers (line 263) | fn build_babe_inherent_providers(
function new_partial (line 297) | pub fn new_partial<Runtime, RuntimeApi>(
function new_full_impl (line 435) | pub async fn new_full_impl<
function new_full (line 1003) | pub async fn new_full<
function setup_database_pool (line 1105) | async fn setup_database_pool(database_url: String) -> Result<DbPool, sc_...
function configure_and_spawn_indexer (line 1112) | async fn configure_and_spawn_indexer<Runtime: StorageEnableRuntime>(
function init_sh_builder (line 1147) | async fn init_sh_builder<R, S, Runtime: StorageEnableRuntime>(
function finish_sh_builder_and_run_tasks (line 1356) | async fn finish_sh_builder_and_run_tasks<R, S, Runtime: StorageEnableRun...
FILE: operator/pallets/datahaven-native-transfer/src/benchmarking.rs
function create_funded_account (line 26) | fn create_funded_account<T: Config>(seed: u32, amount: BalanceOf<T>) -> ...
function ethereum_address (line 33) | fn ethereum_address(seed: u8) -> H160 {
function transfer_to_ethereum (line 47) | fn transfer_to_ethereum() -> Result<(), BenchmarkError> {
function pause (line 82) | fn pause() -> Result<(), BenchmarkError> {
function unpause (line 100) | fn unpause() -> Result<(), BenchmarkError> {
FILE: operator/pallets/datahaven-native-transfer/src/lib.rs
type BalanceOf (line 59) | type BalanceOf<T> =
type Pallet (line 69) | pub struct Pallet<T>(_);
type Config (line 72) | pub trait Config: frame_system::Config {
type Paused (line 104) | pub type Paused<T> = StorageValue<_, bool, ValueQuery>;
type Event (line 108) | pub enum Event<T: Config> {
type Error (line 136) | pub enum Error<T> {
function transfer_to_ethereum (line 171) | pub fn transfer_to_ethereum(
function pause (line 215) | pub fn pause(origin: OriginFor<T>) -> DispatchResult {
function unpause (line 228) | pub fn unpause(origin: OriginFor<T>) -> DispatchResult {
function build_mint_message (line 241) | fn build_mint_message(
function lock_tokens (line 274) | pub fn lock_tokens(who: &T::AccountId, amount: BalanceOf<T>) -> Dispatch...
function unlock_tokens (line 294) | pub fn unlock_tokens(who: &T::AccountId, amount: BalanceOf<T>) -> Dispat...
function total_locked_balance (line 319) | pub fn total_locked_balance() -> BalanceOf<T> {
function ethereum_sovereign_account (line 325) | pub fn ethereum_sovereign_account() -> T::AccountId {
FILE: operator/pallets/datahaven-native-transfer/src/mock.rs
type Block (line 32) | type Block = frame_system::mocking::MockBlock<Test>;
type BaseCallFilter (line 45) | type BaseCallFilter = Everything;
type BlockWeights (line 46) | type BlockWeights = ();
type BlockLength (line 47) | type BlockLength = ();
type DbWeight (line 48) | type DbWeight = ();
type RuntimeOrigin (line 49) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 50) | type RuntimeCall = RuntimeCall;
type Nonce (line 51) | type Nonce = u64;
type Hash (line 52) | type Hash = H256;
type Hashing (line 53) | type Hashing = BlakeTwo256;
type AccountId (line 54) | type AccountId = u64;
type Lookup (line 55) | type Lookup = IdentityLookup<Self::AccountId>;
type Block (line 56) | type Block = Block;
type RuntimeEvent (line 57) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 58) | type BlockHashCount = BlockHashCount;
type Version (line 59) | type Version = ();
type PalletInfo (line 60) | type PalletInfo = PalletInfo;
type AccountData (line 61) | type AccountData = pallet_balances::AccountData<u128>;
type OnNewAccount (line 62) | type OnNewAccount = ();
type OnKilledAccount (line 63) | type OnKilledAccount = ();
type SystemWeightInfo (line 64) | type SystemWeightInfo = ();
type SS58Prefix (line 65) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 66) | type OnSetCode = ();
type MaxConsumers (line 67) | type MaxConsumers = ConstU32<16>;
type RuntimeTask (line 68) | type RuntimeTask = ();
type ExtensionsWeightInfo (line 69) | type ExtensionsWeightInfo = ();
type SingleBlockMigrations (line 70) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 71) | type MultiBlockMigrator = ();
type PreInherents (line 72) | type PreInherents = ();
type PostInherents (line 73) | type PostInherents = ();
type PostTransactions (line 74) | type PostTransactions = ();
type Balance (line 78) | type Balance = u128;
type DustRemoval (line 79) | type DustRemoval = ();
type RuntimeEvent (line 80) | type RuntimeEvent = RuntimeEvent;
type ExistentialDeposit (line 81) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 82) | type AccountStore = System;
type WeightInfo (line 83) | type WeightInfo = ();
type MaxLocks (line 84) | type MaxLocks = ();
type MaxReserves (line 85) | type MaxReserves = MaxReserves;
type ReserveIdentifier (line 86) | type ReserveIdentifier = [u8; 8];
type RuntimeHoldReason (line 87) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 88) | type FreezeIdentifier = ();
type MaxFreezes (line 89) | type MaxFreezes = ConstU32<0>;
type RuntimeFreezeReason (line 90) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 91) | type DoneSlashHandler = ();
type MockOkOutboundQueue (line 95) | pub struct MockOkOutboundQueue;
type Ticket (line 98) | type Ticket = OutboundMessage;
method validate (line 100) | fn validate(
method deliver (line 106) | fn deliver(
type MockNativeTokenId (line 130) | pub struct MockNativeTokenId;
method get (line 132) | fn get() -> Option<H256> {
type RuntimeEvent (line 142) | type RuntimeEvent = RuntimeEvent;
type Currency (line 143) | type Currency = Balances;
type EthereumSovereignAccount (line 144) | type EthereumSovereignAccount = EthereumSovereignAccount;
type OutboundQueue (line 145) | type OutboundQueue = MockOkOutboundQueue;
type NativeTokenId (line 146) | type NativeTokenId = MockNativeTokenId;
type FeeRecipient (line 147) | type FeeRecipient = FeeRecipientAccount;
type WeightInfo (line 148) | type WeightInfo = ();
type PauseOrigin (line 149) | type PauseOrigin = EnsureRoot<u64>;
constant ALICE (line 152) | pub const ALICE: u64 = 1;
constant BOB (line 153) | pub const BOB: u64 = 2;
constant CHARLIE (line 154) | pub const CHARLIE: u64 = 3;
constant ETHEREUM_SOVEREIGN (line 155) | pub const ETHEREUM_SOVEREIGN: u64 = 999;
constant FEE_RECIPIENT (line 156) | pub const FEE_RECIPIENT: u64 = 1000;
constant INITIAL_BALANCE (line 157) | pub const INITIAL_BALANCE: u128 = 10_000;
function new_test_ext (line 159) | pub fn new_test_ext() -> sp_io::TestExternalities {
function last_event (line 180) | pub fn last_event() -> RuntimeEvent {
FILE: operator/pallets/datahaven-native-transfer/src/tests.rs
function ethereum_address (line 27) | fn ethereum_address() -> H160 {
function transfer_to_ethereum_works (line 36) | fn transfer_to_ethereum_works() {
function transfer_zero_amount_fails (line 67) | fn transfer_zero_amount_fails() {
function transfer_to_zero_address_fails (line 82) | fn transfer_to_zero_address_fails() {
function transfer_insufficient_balance_fails (line 97) | fn transfer_insufficient_balance_fails() {
function transfer_when_paused_fails (line 112) | fn transfer_when_paused_fails() {
function multiple_transfers_work (line 133) | fn multiple_transfers_work() {
function transfer_with_zero_fee_fails (line 166) | fn transfer_with_zero_fee_fails() {
function transfer_fails_when_token_not_registered (line 181) | fn transfer_fails_when_token_not_registered() {
function lock_tokens_works (line 206) | fn lock_tokens_works() {
function unlock_tokens_works (line 227) | fn unlock_tokens_works() {
function unlock_insufficient_sovereign_balance_fails (line 263) | fn unlock_insufficient_sovereign_balance_fails() {
function unlock_fails_if_existential_deposit_would_be_consumed (line 274) | fn unlock_fails_if_existential_deposit_would_be_consumed() {
function lock_unlock_different_amounts (line 288) | fn lock_unlock_different_amounts() {
function pause_works (line 317) | fn pause_works() {
function pause_unauthorized_fails (line 331) | fn pause_unauthorized_fails() {
function unpause_works (line 341) | fn unpause_works() {
function unpause_unauthorized_fails (line 361) | fn unpause_unauthorized_fails() {
function pause_unpause_cycle_works (line 371) | fn pause_unpause_cycle_works() {
function transfer_preserves_existential_deposit (line 418) | fn transfer_preserves_existential_deposit() {
function unlock_preserves_existential_deposit (line 443) | fn unlock_preserves_existential_deposit() {
function transfer_with_preservation_mode (line 460) | fn transfer_with_preservation_mode() {
FILE: operator/pallets/datahaven-native-transfer/src/weights.rs
type WeightInfo (line 47) | pub trait WeightInfo {
method transfer_to_ethereum (line 48) | fn transfer_to_ethereum() -> Weight;
method pause (line 49) | fn pause() -> Weight;
method unpause (line 50) | fn unpause() -> Weight;
method transfer_to_ethereum (line 72) | fn transfer_to_ethereum() -> Weight {
method pause (line 92) | fn pause() -> Weight {
method unpause (line 112) | fn unpause() -> Weight {
method transfer_to_ethereum (line 141) | fn transfer_to_ethereum() -> Weight {
method pause (line 161) | fn pause() -> Weight {
method unpause (line 181) | fn unpause() -> Weight {
type SubstrateWeight (line 54) | pub struct SubstrateWeight<T>(PhantomData<T>);
FILE: operator/pallets/ethereum-client/fixtures/src/lib.rs
constant SC_SIZE (line 16) | const SC_SIZE: usize = 512;
constant SC_BITS_SIZE (line 17) | const SC_BITS_SIZE: usize = 64;
type CheckpointUpdate (line 18) | type CheckpointUpdate = snowbridge_beacon_primitives::CheckpointUpdate<S...
type Update (line 19) | type Update = snowbridge_beacon_primitives::Update<SC_SIZE, SC_BITS_SIZE>;
function make_checkpoint (line 21) | pub fn make_checkpoint() -> Box<CheckpointUpdate> {
function make_sync_committee_update (line 568) | pub fn make_sync_committee_update() -> Box<Update> {
function make_finalized_header_update (line 1137) | pub fn make_finalized_header_update() -> Box<Update> {
function make_execution_proof (line 1180) | pub fn make_execution_proof() -> Box<ExecutionProof> {
function make_inbound_fixture (line 1235) | pub fn make_inbound_fixture() -> InboundQueueFixture {
FILE: operator/pallets/ethereum-client/src/benchmarking/mod.rs
function force_checkpoint (line 23) | fn force_checkpoint() -> Result<(), BenchmarkError> {
function submit (line 37) | fn submit() -> Result<(), BenchmarkError> {
function submit_with_sync_committee (line 60) | fn submit_with_sync_committee() -> Result<(), BenchmarkError> {
function bls_fast_aggregate_verify_pre_aggregated (line 78) | fn bls_fast_aggregate_verify_pre_aggregated() -> Result<(), BenchmarkErr...
function bls_fast_aggregate_verify (line 96) | fn bls_fast_aggregate_verify() -> Result<(), BenchmarkError> {
function verify_merkle_proof (line 118) | fn verify_merkle_proof() -> Result<(), BenchmarkError> {
FILE: operator/pallets/ethereum-client/src/benchmarking/util.rs
function participant_pubkeys (line 10) | pub fn participant_pubkeys<T: Config>(
function absent_pubkeys (line 24) | pub fn absent_pubkeys<T: Config>(update: &Update) -> Result<Vec<PublicKe...
function signing_root (line 36) | pub fn signing_root<T: Config>(update: &Update) -> Result<H256, &'static...
FILE: operator/pallets/ethereum-client/src/config/altair.rs
constant BLOCK_ROOTS_INDEX (line 7) | pub const BLOCK_ROOTS_INDEX: usize = 37;
constant FINALIZED_ROOT_INDEX (line 9) | pub const FINALIZED_ROOT_INDEX: usize = 105;
constant CURRENT_SYNC_COMMITTEE_INDEX (line 11) | pub const CURRENT_SYNC_COMMITTEE_INDEX: usize = 54;
constant NEXT_SYNC_COMMITTEE_INDEX (line 13) | pub const NEXT_SYNC_COMMITTEE_INDEX: usize = 55;
constant EXECUTION_HEADER_INDEX (line 15) | pub const EXECUTION_HEADER_INDEX: usize = 25;
FILE: operator/pallets/ethereum-client/src/config/electra.rs
constant BLOCK_ROOTS_INDEX (line 7) | pub const BLOCK_ROOTS_INDEX: usize = 69;
constant FINALIZED_ROOT_INDEX (line 9) | pub const FINALIZED_ROOT_INDEX: usize = 169;
constant CURRENT_SYNC_COMMITTEE_INDEX (line 11) | pub const CURRENT_SYNC_COMMITTEE_INDEX: usize = 86;
constant NEXT_SYNC_COMMITTEE_INDEX (line 13) | pub const NEXT_SYNC_COMMITTEE_INDEX: usize = 87;
FILE: operator/pallets/ethereum-client/src/config/mod.rs
constant MAX_EXTRA_DATA_BYTES (line 9) | pub const MAX_EXTRA_DATA_BYTES: usize = 32;
constant MAX_LOGS_BLOOM_SIZE (line 10) | pub const MAX_LOGS_BLOOM_SIZE: usize = 256;
constant MAX_FEE_RECIPIENT_SIZE (line 11) | pub const MAX_FEE_RECIPIENT_SIZE: usize = 20;
constant MAX_BRANCH_PROOF_SIZE (line 14) | pub const MAX_BRANCH_PROOF_SIZE: usize = 20;
constant DOMAIN_SYNC_COMMITTEE (line 18) | pub const DOMAIN_SYNC_COMMITTEE: [u8; 4] = [7, 0, 0, 0];
constant PUBKEY_SIZE (line 20) | pub const PUBKEY_SIZE: usize = 48;
constant SIGNATURE_SIZE (line 22) | pub const SIGNATURE_SIZE: usize = 96;
constant SLOTS_PER_EPOCH (line 29) | pub const SLOTS_PER_EPOCH: usize = 32;
constant EPOCHS_PER_SYNC_COMMITTEE_PERIOD (line 32) | pub const EPOCHS_PER_SYNC_COMMITTEE_PERIOD: usize = 256;
constant SYNC_COMMITTEE_SIZE (line 34) | pub const SYNC_COMMITTEE_SIZE: usize = 512;
constant SYNC_COMMITTEE_BITS_SIZE (line 36) | pub const SYNC_COMMITTEE_BITS_SIZE: usize = SYNC_COMMITTEE_SIZE / 8;
constant SLOTS_PER_HISTORICAL_ROOT (line 38) | pub const SLOTS_PER_HISTORICAL_ROOT: usize = 8192;
constant BLOCK_ROOT_AT_INDEX_DEPTH (line 40) | pub const BLOCK_ROOT_AT_INDEX_DEPTH: usize = 13;
FILE: operator/pallets/ethereum-client/src/debug_merkle.rs
function debug_sync_committee_merkle_proof (line 17) | fn debug_sync_committee_merkle_proof() {
function compare_json_vs_hardcoded_merkle_branch (line 78) | fn compare_json_vs_hardcoded_merkle_branch() {
FILE: operator/pallets/ethereum-client/src/functions.rs
function decompress_sync_committee_bits (line 10) | pub fn decompress_sync_committee_bits(
function compute_period (line 20) | pub fn compute_period(slot: u64) -> u64 {
function compute_epoch (line 25) | pub fn compute_epoch(slot: u64, slots_per_epoch: u64) -> u64 {
function sync_committee_sum (line 30) | pub fn sync_committee_sum(sync_committee_bits: &[u8]) -> u32 {
FILE: operator/pallets/ethereum-client/src/impls.rs
method verify (line 20) | fn verify(event_log: &Log, proof: &Proof) -> Result<(), VerificationErro...
function verify_receipt_inclusion (line 53) | pub fn verify_receipt_inclusion(
function verify_execution_proof (line 75) | pub(crate) fn verify_execution_proof(execution_proof: &ExecutionProof) -...
function verify_ancestry_proof (line 136) | fn verify_ancestry_proof(
FILE: operator/pallets/ethereum-client/src/lib.rs
constant LOG_TARGET (line 68) | pub const LOG_TARGET: &str = "ethereum-client";
type MaxFinalizedHeadersToKeep (line 80) | pub struct MaxFinalizedHeadersToKeep<T: Config>(PhantomData<T>);
function get (line 82) | fn get() -> u32 {
type Pallet (line 89) | pub struct Pallet<T>(_);
type Config (line 92) | pub trait Config: frame_system::Config {
type Event (line 104) | pub enum Event<T: Config> {
type Error (line 119) | pub enum Error<T> {
type InitialCheckpointRoot (line 156) | pub type InitialCheckpointRoot<T: Config> = StorageValue<_, H256, ValueQ...
type LatestFinalizedBlockRoot (line 161) | pub type LatestFinalizedBlockRoot<T: Config> = StorageValue<_, H256, Val...
type FinalizedBeaconState (line 166) | pub type FinalizedBeaconState<T: Config> =
type FinalizedBeaconStateIndex (line 171) | pub type FinalizedBeaconStateIndex<T: Config> = StorageValue<_, u32, Val...
type FinalizedBeaconStateMapping (line 175) | pub type FinalizedBeaconStateMapping<T: Config> =
type ValidatorsRoot (line 180) | pub type ValidatorsRoot<T: Config> = StorageValue<_, H256, ValueQuery>;
type CurrentSyncCommittee (line 184) | pub type CurrentSyncCommittee<T: Config> = StorageValue<_, SyncCommittee...
type NextSyncCommittee (line 188) | pub type NextSyncCommittee<T: Config> = StorageValue<_, SyncCommitteePre...
type LatestSyncCommitteeUpdatePeriod (line 192) | pub type LatestSyncCommitteeUpdatePeriod<T: Config> = StorageValue<_, u6...
type OperatingMode (line 197) | pub type OperatingMode<T: Config> = StorageValue<_, BasicOperatingMode, ...
function force_checkpoint (line 206) | pub fn force_checkpoint(
function submit (line 225) | pub fn submit(origin: OriginFor<T>, update: Box<Update>) -> DispatchResu...
function set_operating_mode (line 234) | pub fn set_operating_mode(
function process_checkpoint_update (line 250) | pub(crate) fn process_checkpoint_update(update: &CheckpointUpdate) -> Di...
function process_update (line 307) | pub(crate) fn process_update(update: &Update) -> DispatchResultWithPostI...
function verify_update (line 316) | fn verify_update(update: &Update) -> DispatchResult {
function apply_update (line 476) | fn apply_update(update: &Update) -> DispatchResultWithPostInfo {
function compute_signing_root (line 529) | pub(super) fn compute_signing_root(
function store_finalized_header (line 550) | pub fn store_finalized_header(
function store_validators_root (line 588) | fn store_validators_root(validators_root: H256) {
function compute_domain (line 597) | pub(super) fn compute_domain(
function compute_fork_data_root (line 614) | fn compute_fork_data_root(
function sync_committee_participation_is_supermajority (line 631) | pub(super) fn sync_committee_participation_is_supermajority(
function compute_fork_version (line 645) | pub(super) fn compute_fork_version(epoch: u64) -> ForkVersion {
function select_fork_version (line 650) | pub(super) fn select_fork_version(fork_versions: &ForkVersions, epoch: u...
function find_pubkeys (line 678) | pub fn find_pubkeys(
function signing_root (line 697) | pub fn signing_root(
function check_refundable (line 717) | pub(super) fn check_refundable(update: &Update, latest_slot: u64) -> Pays {
function finalized_root_gindex_at_slot (line 741) | pub fn finalized_root_gindex_at_slot(slot: u64, fork_versions: ForkVersi...
function current_sync_committee_gindex_at_slot (line 751) | pub fn current_sync_committee_gindex_at_slot(
function next_sync_committee_gindex_at_slot (line 764) | pub fn next_sync_committee_gindex_at_slot(slot: u64, fork_versions: Fork...
function block_roots_gindex_at_slot (line 774) | pub fn block_roots_gindex_at_slot(slot: u64, fork_versions: ForkVersions...
function execution_header_gindex (line 784) | pub fn execution_header_gindex() -> usize {
FILE: operator/pallets/ethereum-client/src/mock.rs
type Block (line 12) | type Block = frame_system::mocking::MockBlock<Test>;
function load_fixture (line 16) | fn load_fixture<T>(basename: String) -> Result<T, serde_json::Error>
function load_execution_proof_fixture (line 26) | pub fn load_execution_proof_fixture() -> snowbridge_beacon_primitives::E...
function load_checkpoint_update_fixture (line 30) | pub fn load_checkpoint_update_fixture(
function load_sync_committee_update_fixture (line 35) | pub fn load_sync_committee_update_fixture() -> snowbridge_beacon_primiti...
function load_finalized_header_update_fixture (line 42) | pub fn load_finalized_header_update_fixture() -> snowbridge_beacon_primi...
function load_next_sync_committee_update_fixture (line 49) | pub fn load_next_sync_committee_update_fixture() -> snowbridge_beacon_pr...
function load_next_finalized_header_update_fixture (line 56) | pub fn load_next_finalized_header_update_fixture() -> snowbridge_beacon_...
function load_sync_committee_update_period_0 (line 63) | pub fn load_sync_committee_update_period_0() -> Box<
function load_sync_committee_update_period_0_older_fixture (line 72) | pub fn load_sync_committee_update_period_0_older_fixture() -> Box<
function load_sync_committee_update_period_0_newer_fixture (line 81) | pub fn load_sync_committee_update_period_0_newer_fixture() -> Box<
function get_message_verification_payload (line 90) | pub fn get_message_verification_payload() -> (Log, Proof) {
type Block (line 105) | type Block = Block;
type Moment (line 109) | type Moment = u64;
type OnTimestampSet (line 110) | type OnTimestampSet = ();
type MinimumPeriod (line 111) | type MinimumPeriod = ();
type WeightInfo (line 112) | type WeightInfo = ();
constant FREE_SLOTS_INTERVAL (line 144) | pub const FREE_SLOTS_INTERVAL: u32 = config::SLOTS_PER_EPOCH as u32;
type RuntimeEvent (line 147) | type RuntimeEvent = RuntimeEvent;
type ForkVersions (line 148) | type ForkVersions = ChainForkVersions;
type FreeHeadersInterval (line 149) | type FreeHeadersInterval = ConstU32<FREE_SLOTS_INTERVAL>;
type WeightInfo (line 150) | type WeightInfo = ();
function new_tester (line 154) | pub fn new_tester() -> sp_io::TestExternalities {
function initialize_storage (line 162) | pub fn initialize_storage() -> DispatchResult {
FILE: operator/pallets/ethereum-client/src/mock_electra.rs
type Block (line 12) | type Block = frame_system::mocking::MockBlock<Test>;
function load_fixture (line 16) | fn load_fixture<T>(basename: String) -> Result<T, serde_json::Error>
function load_execution_proof_fixture (line 26) | pub fn load_execution_proof_fixture() -> snowbridge_beacon_primitives::E...
function load_checkpoint_update_fixture (line 30) | pub fn load_checkpoint_update_fixture(
function load_sync_committee_update_fixture (line 35) | pub fn load_sync_committee_update_fixture() -> snowbridge_beacon_primiti...
function load_finalized_header_update_fixture (line 42) | pub fn load_finalized_header_update_fixture() -> snowbridge_beacon_primi...
function load_next_sync_committee_update_fixture (line 49) | pub fn load_next_sync_committee_update_fixture() -> snowbridge_beacon_pr...
function load_next_finalized_header_update_fixture (line 56) | pub fn load_next_finalized_header_update_fixture() -> snowbridge_beacon_...
function load_other_finalized_header_update_fixture (line 63) | pub fn load_other_finalized_header_update_fixture() -> snowbridge_beacon...
function get_message_verification_payload (line 70) | pub fn get_message_verification_payload() -> (Log, Proof) {
type Block (line 85) | type Block = Block;
type Moment (line 89) | type Moment = u64;
type OnTimestampSet (line 90) | type OnTimestampSet = ();
type MinimumPeriod (line 91) | type MinimumPeriod = ();
type WeightInfo (line 92) | type WeightInfo = ();
constant FREE_SLOTS_INTERVAL (line 124) | pub const FREE_SLOTS_INTERVAL: u32 = config::SLOTS_PER_EPOCH as u32;
type RuntimeEvent (line 127) | type RuntimeEvent = RuntimeEvent;
type ForkVersions (line 128) | type ForkVersions = ChainForkVersions;
type FreeHeadersInterval (line 129) | type FreeHeadersInterval = ConstU32<FREE_SLOTS_INTERVAL>;
type WeightInfo (line 130) | type WeightInfo = ();
function new_tester (line 134) | pub fn new_tester() -> sp_io::TestExternalities {
function initialize_storage (line 142) | pub fn initialize_storage() -> DispatchResult {
FILE: operator/pallets/ethereum-client/src/tests.rs
constant TEST_HASH (line 28) | const TEST_HASH: [u8; 32] =
function sum_sync_committee_participation (line 34) | pub fn sum_sync_committee_participation() {
function compute_domain (line 41) | pub fn compute_domain() {
function compute_signing_root_bls (line 58) | pub fn compute_signing_root_bls() {
function compute_signing_root (line 87) | pub fn compute_signing_root() {
function compute_domain_bls (line 116) | pub fn compute_domain_bls() {
function may_refund_call_fee (line 133) | pub fn may_refund_call_fee() {
function verify_merkle_branch_for_finalized_root (line 166) | pub fn verify_merkle_branch_for_finalized_root() {
function verify_merkle_branch_fails_if_depth_and_branch_dont_match (line 186) | pub fn verify_merkle_branch_fails_if_depth_and_branch_dont_match() {
function sync_committee_participation_is_supermajority (line 203) | pub fn sync_committee_participation_is_supermajority() {
function sync_committee_participation_is_supermajority_errors_when_not_supermajority (line 213) | pub fn sync_committee_participation_is_supermajority_errors_when_not_sup...
function compute_fork_version (line 225) | fn compute_fork_version() {
function find_absent_keys (line 289) | fn find_absent_keys() {
function find_present_keys (line 313) | fn find_present_keys() {
function process_initial_checkpoint (line 341) | fn process_initial_checkpoint() {
function process_initial_checkpoint_with_invalid_sync_committee_proof (line 355) | fn process_initial_checkpoint_with_invalid_sync_committee_proof() {
function process_initial_checkpoint_with_invalid_blocks_root_proof (line 368) | fn process_initial_checkpoint_with_invalid_blocks_root_proof() {
function submit_update_in_current_period (line 381) | fn submit_update_in_current_period() {
function submit_update_with_sync_committee_in_current_period (line 399) | fn submit_update_with_sync_committee_in_current_period() {
function reject_submit_update_in_next_period (line 417) | fn reject_submit_update_in_next_period() {
function submit_update_with_invalid_header_proof (line 454) | fn submit_update_with_invalid_header_proof() {
function submit_update_with_invalid_block_roots_proof (line 472) | fn submit_update_with_invalid_block_roots_proof() {
function submit_update_with_invalid_next_sync_committee_proof (line 490) | fn submit_update_with_invalid_next_sync_committee_proof() {
function submit_update_with_skipped_period (line 510) | fn submit_update_with_skipped_period() {
function submit_update_with_sync_committee_in_next_period (line 531) | fn submit_update_with_sync_committee_in_next_period() {
function submit_update_with_sync_committee_invalid_signature_slot (line 560) | fn submit_update_with_sync_committee_invalid_signature_slot() {
function submit_update_with_skipped_sync_committee_period (line 577) | fn submit_update_with_skipped_sync_committee_period() {
function submit_irrelevant_update (line 593) | fn submit_irrelevant_update() {
function submit_update_with_missing_bootstrap (line 613) | fn submit_update_with_missing_bootstrap() {
function submit_update_with_invalid_sync_committee_update (line 624) | fn submit_update_with_invalid_sync_committee_update() {
function submit_finalized_header_update_with_too_large_gap (line 657) | fn submit_finalized_header_update_with_too_large_gap() {
function submit_finalized_header_update_with_gap_at_limit (line 688) | fn submit_finalized_header_update_with_gap_at_limit() {
function duplicate_sync_committee_updates_are_not_free (line 721) | fn duplicate_sync_committee_updates_are_not_free() {
function sync_committee_update_for_sync_committee_already_imported_are_not_free (line 741) | fn sync_committee_update_for_sync_committee_already_imported_are_not_fre...
function verify_message (line 791) | fn verify_message() {
function verify_message_invalid_proof (line 801) | fn verify_message_invalid_proof() {
function verify_message_invalid_receipts_root (line 815) | fn verify_message_invalid_receipts_root() {
function verify_message_invalid_log (line 833) | fn verify_message_invalid_log() {
function verify_message_receipt_does_not_contain_log (line 846) | fn verify_message_receipt_does_not_contain_log() {
function set_operating_mode (line 860) | fn set_operating_mode() {
function set_operating_mode_root_only (line 880) | fn set_operating_mode_root_only() {
function verify_execution_proof_invalid_ancestry_proof (line 893) | fn verify_execution_proof_invalid_ancestry_proof() {
function verify_execution_proof_invalid_execution_header_proof (line 915) | fn verify_execution_proof_invalid_execution_header_proof() {
function verify_execution_proof_that_is_also_finalized_header_which_is_not_stored (line 935) | fn verify_execution_proof_that_is_also_finalized_header_which_is_not_sto...
function submit_execution_proof_that_is_also_finalized_header_which_is_stored_but_slots_dont_match (line 955) | fn submit_execution_proof_that_is_also_finalized_header_which_is_stored_...
function verify_execution_proof_not_finalized (line 987) | fn verify_execution_proof_not_finalized() {
FILE: operator/pallets/ethereum-client/src/tests_electra.rs
constant TEST_HASH (line 27) | const TEST_HASH: [u8; 32] =
function sum_sync_committee_participation (line 33) | pub fn sum_sync_committee_participation() {
function compute_domain (line 40) | pub fn compute_domain() {
function compute_signing_root_bls (line 57) | pub fn compute_signing_root_bls() {
function compute_signing_root (line 86) | pub fn compute_signing_root() {
function compute_domain_bls (line 115) | pub fn compute_domain_bls() {
function may_refund_call_fee (line 132) | pub fn may_refund_call_fee() {
function verify_merkle_branch_for_finalized_root (line 165) | pub fn verify_merkle_branch_for_finalized_root() {
function verify_merkle_branch_fails_if_depth_and_branch_dont_match (line 185) | pub fn verify_merkle_branch_fails_if_depth_and_branch_dont_match() {
function sync_committee_participation_is_supermajority (line 202) | pub fn sync_committee_participation_is_supermajority() {
function sync_committee_participation_is_supermajority_errors_when_not_supermajority (line 212) | pub fn sync_committee_participation_is_supermajority_errors_when_not_sup...
function compute_fork_version (line 224) | fn compute_fork_version() {
function find_absent_keys (line 288) | fn find_absent_keys() {
function find_present_keys (line 312) | fn find_present_keys() {
function process_initial_checkpoint (line 340) | fn process_initial_checkpoint() {
function process_initial_checkpoint_with_invalid_sync_committee_proof (line 354) | fn process_initial_checkpoint_with_invalid_sync_committee_proof() {
function process_initial_checkpoint_with_invalid_blocks_root_proof (line 367) | fn process_initial_checkpoint_with_invalid_blocks_root_proof() {
function submit_update_in_current_period (line 380) | fn submit_update_in_current_period() {
function submit_update_with_sync_committee_in_current_period (line 398) | fn submit_update_with_sync_committee_in_current_period() {
function reject_submit_update_in_next_period (line 416) | fn reject_submit_update_in_next_period() {
function submit_update_with_invalid_header_proof (line 443) | fn submit_update_with_invalid_header_proof() {
function submit_update_with_invalid_block_roots_proof (line 461) | fn submit_update_with_invalid_block_roots_proof() {
function submit_update_with_invalid_next_sync_committee_proof (line 479) | fn submit_update_with_invalid_next_sync_committee_proof() {
function submit_update_with_skipped_period (line 499) | fn submit_update_with_skipped_period() {
function submit_update_with_sync_committee_in_next_period (line 520) | fn submit_update_with_sync_committee_in_next_period() {
function submit_update_with_sync_committee_invalid_signature_slot (line 548) | fn submit_update_with_sync_committee_invalid_signature_slot() {
function submit_update_with_skipped_sync_committee_period (line 565) | fn submit_update_with_skipped_sync_committee_period() {
function submit_irrelevant_update (line 581) | fn submit_irrelevant_update() {
function submit_update_with_missing_bootstrap (line 601) | fn submit_update_with_missing_bootstrap() {
function submit_update_with_invalid_sync_committee_update (line 612) | fn submit_update_with_invalid_sync_committee_update() {
function submit_finalized_header_update_with_too_large_gap (line 645) | fn submit_finalized_header_update_with_too_large_gap() {
function submit_finalized_header_update_with_gap_at_limit (line 676) | fn submit_finalized_header_update_with_gap_at_limit() {
function duplicate_sync_committee_updates_are_not_free (line 709) | fn duplicate_sync_committee_updates_are_not_free() {
function verify_message (line 731) | fn verify_message() {
function verify_message_invalid_proof (line 741) | fn verify_message_invalid_proof() {
function verify_message_invalid_receipts_root (line 755) | fn verify_message_invalid_receipts_root() {
function verify_message_invalid_log (line 773) | fn verify_message_invalid_log() {
function verify_message_receipt_does_not_contain_log (line 786) | fn verify_message_receipt_does_not_contain_log() {
function set_operating_mode (line 800) | fn set_operating_mode() {
function set_operating_mode_root_only (line 820) | fn set_operating_mode_root_only() {
function verify_execution_proof_invalid_ancestry_proof (line 833) | fn verify_execution_proof_invalid_ancestry_proof() {
function verify_execution_proof_invalid_execution_header_proof (line 855) | fn verify_execution_proof_invalid_execution_header_proof() {
function verify_execution_proof_that_is_also_finalized_header_which_is_not_stored (line 875) | fn verify_execution_proof_that_is_also_finalized_header_which_is_not_sto...
function submit_execution_proof_that_is_also_finalized_header_which_is_stored_but_slots_dont_match (line 895) | fn submit_execution_proof_that_is_also_finalized_header_which_is_stored_...
function verify_execution_proof_not_finalized (line 927) | fn verify_execution_proof_not_finalized() {
FILE: operator/pallets/ethereum-client/src/types.rs
type SyncCommittee (line 11) | pub type SyncCommittee = snowbridge_beacon_primitives::SyncCommittee<SC_...
type SyncCommitteePrepared (line 12) | pub type SyncCommitteePrepared = snowbridge_beacon_primitives::SyncCommi...
type SyncAggregate (line 13) | pub type SyncAggregate = snowbridge_beacon_primitives::SyncAggregate<SC_...
type CheckpointUpdate (line 14) | pub type CheckpointUpdate = snowbridge_beacon_primitives::CheckpointUpda...
type Update (line 15) | pub type Update = snowbridge_beacon_primitives::Update<SC_SIZE, SC_BITS_...
type NextSyncCommitteeUpdate (line 16) | pub type NextSyncCommitteeUpdate = snowbridge_beacon_primitives::NextSyn...
type FinalizedBeaconStateBuffer (line 21) | pub type FinalizedBeaconStateBuffer<T> = RingBufferMapImpl<
FILE: operator/pallets/ethereum-client/src/weights.rs
type WeightInfo (line 35) | pub trait WeightInfo {
method force_checkpoint (line 36) | fn force_checkpoint() -> Weight;
method submit (line 37) | fn submit() -> Weight;
method submit_with_sync_committee (line 38) | fn submit_with_sync_committee() -> Weight;
method force_checkpoint (line 43) | fn force_checkpoint() -> Weight {
method submit (line 49) | fn submit() -> Weight {
method submit_with_sync_committee (line 55) | fn submit_with_sync_committee() -> Weight {
FILE: operator/pallets/external-validator-slashes/src/benchmarking.rs
constant MAX_SLASHES (line 31) | const MAX_SLASHES: u32 = 1000;
function cancel_deferred_slash (line 39) | fn cancel_deferred_slash(s: Linear<1, MAX_SLASHES>) -> Result<(), Benchm...
function force_inject_slash (line 80) | fn force_inject_slash() -> Result<(), BenchmarkError> {
function process_slashes_queue (line 104) | fn process_slashes_queue(s: Linear<1, 200>) -> Result<(), BenchmarkError> {
function set_slashing_mode (line 135) | fn set_slashing_mode() -> Result<(), BenchmarkError> {
FILE: operator/pallets/external-validator-slashes/src/lib.rs
type OffenceKind (line 78) | pub enum OffenceKind {
method to_description (line 88) | pub fn to_description(&self) -> String {
type SlashData (line 101) | pub struct SlashData<AccountId> {
type SendMessage (line 108) | pub trait SendMessage<AccountId> {
method build (line 112) | fn build(utils: &Vec<SlashData<AccountId>>, era: u32) -> Option<Self::...
method validate (line 114) | fn validate(message: Self::Message) -> Result<Self::Ticket, SendError>;
method deliver (line 116) | fn deliver(ticket: Self::Ticket) -> Result<H256, SendError>;
type Event (line 126) | pub enum Event<T: Config> {
type Config (line 142) | pub trait Config: frame_system::Config {
type Error (line 205) | pub enum Error<T> {
type SlashingModeOption (line 235) | pub enum SlashingModeOption {
type Pallet (line 243) | pub struct Pallet<T>(PhantomData<T>);
type ValidatorSlashInEra (line 248) | pub type ValidatorSlashInEra<T: Config> =
type BondedEras (line 257) | pub type BondedEras<T: Config> =
type NextSlashId (line 263) | pub type NextSlashId<T: Config> = StorageValue<_, T::SlashId, ValueQuery>;
type Slashes (line 269) | pub type Slashes<T: Config> =
type UnreportedSlashesQueue (line 276) | pub type UnreportedSlashesQueue<T: Config> =
type SlashingMode (line 281) | pub type SlashingMode<T: Config> = StorageValue<_, SlashingModeOption, V...
type PendingOffenceKind (line 294) | pub type PendingOffenceKind<T: Config> = StorageDoubleMap<
type GenesisConfig (line 306) | pub struct GenesisConfig<T: Config> {
method build (line 315) | fn build(&self) {
function cancel_deferred_slash (line 325) | pub fn cancel_deferred_slash(
function force_inject_slash (line 367) | pub fn force_inject_slash(
function set_slashing_mode (line 420) | pub fn set_slashing_mode(origin: OriginFor<T>, mode: SlashingModeOption)...
function on_initialize (line 431) | fn on_initialize(_n: BlockNumberFor<T>) -> Weight {
function on_offence (line 459) | fn on_offence(
method on_era_start (line 614) | fn on_era_start(era_index: EraIndex, session_start: SessionIndex, extern...
function add_era_slashes_to_queue (line 657) | fn add_era_slashes_to_queue(active_era: EraIndex) {
function process_slashes_queue (line 673) | fn process_slashes_queue(amount: u32) -> Option<u32> {
type Slash (line 748) | pub struct Slash<AccountId, SlashId> {
function compute_slash (line 768) | pub(crate) fn compute_slash<T: Config>(
function is_sorted_and_unique (line 805) | fn is_sorted_and_unique(list: &[u32]) -> bool {
type OffenceKindProvider (line 810) | pub trait OffenceKindProvider {
method kind (line 811) | fn kind() -> OffenceKind;
method kind (line 887) | fn kind() -> OffenceKind {
method kind (line 894) | fn kind() -> OffenceKind {
method kind (line 901) | fn kind() -> OffenceKind {
method kind (line 908) | fn kind() -> OffenceKind {
type HasValidatorId (line 815) | pub trait HasValidatorId<ValidatorId> {
method validator_id (line 816) | fn validator_id(&self) -> &ValidatorId;
function validator_id (line 820) | fn validator_id(&self) -> &V {
type EquivocationReportWrapper (line 835) | pub struct EquivocationReportWrapper<T, Inner, Kind>(PhantomData<(T, Inn...
function report_offence (line 845) | fn report_offence(reporters: Vec<R>, offence: O) -> Result<(), OffenceEr...
function is_known_offence (line 880) | fn is_known_offence(offenders: &[Id], time_slot: &O::TimeSlot) -> bool {
type BabeEquivocation (line 885) | pub struct BabeEquivocation;
type GrandpaEquivocation (line 892) | pub struct GrandpaEquivocation;
type BeefyEquivocation (line 899) | pub struct BeefyEquivocation;
type ImOnlineUnresponsive (line 906) | pub struct ImOnlineUnresponsive;
FILE: operator/pallets/external-validator-slashes/src/mock.rs
type Block (line 42) | type Block = frame_system::mocking::MockBlock<Test>;
type Moment (line 57) | type Moment = u64;
type OnTimestampSet (line 58) | type OnTimestampSet = ();
type MinimumPeriod (line 59) | type MinimumPeriod = ConstU64<5>;
type WeightInfo (line 60) | type WeightInfo = ();
type BaseCallFilter (line 64) | type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights (line 65) | type BlockWeights = ();
type BlockLength (line 66) | type BlockLength = ();
type DbWeight (line 67) | type DbWeight = RocksDbWeight;
type RuntimeOrigin (line 68) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 69) | type RuntimeCall = RuntimeCall;
type Nonce (line 70) | type Nonce = u64;
type Block (line 71) | type Block = Block;
type Hash (line 72) | type Hash = H256;
type Hashing (line 73) | type Hashing = BlakeTwo256;
type AccountId (line 74) | type AccountId = u64;
type Lookup (line 75) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 76) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 77) | type BlockHashCount = ConstU64<250>;
type Version (line 78) | type Version = ();
type PalletInfo (line 79) | type PalletInfo = PalletInfo;
type AccountData (line 80) | type AccountData = ();
type OnNewAccount (line 81) | type OnNewAccount = ();
type OnKilledAccount (line 82) | type OnKilledAccount = ();
type SystemWeightInfo (line 83) | type SystemWeightInfo = ();
type SS58Prefix (line 84) | type SS58Prefix = ConstU16<42>;
type OnSetCode (line 85) | type OnSetCode = ();
type MaxConsumers (line 86) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type RuntimeTask (line 87) | type RuntimeTask = ();
type SingleBlockMigrations (line 88) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 89) | type MultiBlockMigrator = ();
type PreInherents (line 90) | type PreInherents = ();
type PostInherents (line 91) | type PostInherents = ();
type PostTransactions (line 92) | type PostTransactions = ();
type ExtensionsWeightInfo (line 93) | type ExtensionsWeightInfo = ();
type TestSessionManager (line 104) | pub struct TestSessionManager;
method new_session (line 106) | fn new_session(_new_index: SessionIndex) -> Option<Vec<u64>> {
method end_session (line 109) | fn end_session(_: SessionIndex) {}
method start_session (line 110) | fn start_session(_: SessionIndex) {}
method new_session (line 114) | fn new_session(_new_index: SessionIndex) -> Option<Vec<(u64, ())>> {
method end_session (line 120) | fn end_session(_: SessionIndex) {}
method start_session (line 121) | fn start_session(_: SessionIndex) {}
type MockEraIndexProvider (line 129) | pub struct MockEraIndexProvider;
method with_era (line 141) | pub fn with_era(era_index: EraIndex) {
method active_era (line 147) | fn active_era() -> ActiveEraInfo {
method era_to_session_start (line 153) | fn era_to_session_start(era_index: EraIndex) -> Option<SessionIndex> {
type SessionManager (line 165) | type SessionManager = pallet_session::historical::NoteHistoricalRoot<Tes...
type Keys (line 166) | type Keys = SessionKeys;
type ShouldEndSession (line 167) | type ShouldEndSession = pallet_session::PeriodicSessions<Period, Offset>;
type SessionHandler (line 168) | type SessionHandler = TestSessionHandler;
type RuntimeEvent (line 169) | type RuntimeEvent = RuntimeEvent;
type ValidatorId (line 170) | type ValidatorId = <Self as frame_system::Config>::AccountId;
type ValidatorIdOf (line 171) | type ValidatorIdOf = ConvertInto;
type NextSessionRotation (line 172) | type NextSessionRotation = pallet_session::PeriodicSessions<Period, Offs...
type WeightInfo (line 173) | type WeightInfo = ();
type AccountId (line 183) | type AccountId = u64;
type TestSessionHandler (line 184) | pub struct TestSessionHandler;
constant KEY_TYPE_IDS (line 186) | const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthority...
method on_genesis_session (line 188) | fn on_genesis_session<Ks: sp_runtime::traits::OpaqueKeys>(_validators:...
method on_new_session (line 190) | fn on_new_session<Ks: sp_runtime::traits::OpaqueKeys>(
method on_disabled (line 196) | fn on_disabled(_: u32) {}
type MockInvulnerableProvider (line 199) | pub struct MockInvulnerableProvider;
method invulnerables (line 201) | fn invulnerables() -> Vec<u64> {
type DeferPeriodGetter (line 206) | pub struct DeferPeriodGetter;
method get (line 208) | fn get() -> EraIndex {
method with_defer_period (line 214) | pub fn with_defer_period(defer_period: EraIndex) {
type MockOkOutboundQueue (line 219) | pub struct MockOkOutboundQueue;
method last_sent_slashes (line 221) | pub fn last_sent_slashes() -> Vec<crate::SlashData<AccountId>> {
type Ticket (line 226) | type Ticket = ();
type Message (line 227) | type Message = ();
method build (line 228) | fn build(slashes: &Vec<crate::SlashData<AccountId>>, _: u32) -> Option...
method validate (line 232) | fn validate(_: Self::Ticket) -> Result<Self::Ticket, SendError> {
method deliver (line 235) | fn deliver(_: Self::Ticket) -> Result<H256, SendError> {
type Balance (line 241) | type Balance = u128;
method local_fee (line 243) | fn local_fee() -> Self::Balance {
type TimestampProvider (line 248) | pub struct TimestampProvider;
method get_external_index (line 250) | fn get_external_index() -> u64 {
type RuntimeEvent (line 260) | type RuntimeEvent = RuntimeEvent;
type ValidatorId (line 261) | type ValidatorId = <Self as frame_system::Config>::AccountId;
type ValidatorIdOf (line 262) | type ValidatorIdOf = IdentityValidator;
type SlashDeferDuration (line 263) | type SlashDeferDuration = DeferPeriodGetter;
type BondingDuration (line 264) | type BondingDuration = BondingDuration;
type SlashId (line 265) | type SlashId = u32;
type EraIndexProvider (line 266) | type EraIndexProvider = MockEraIndexProvider;
type InvulnerablesProvider (line 267) | type InvulnerablesProvider = MockInvulnerableProvider;
type ExternalIndexProvider (line 268) | type ExternalIndexProvider = TimestampProvider;
type MaxSlashWad (line 269) | type MaxSlashWad = ConstU128<50_000_000_000_000_000>;
type QueuedSlashesProcessedPerBlock (line 270) | type QueuedSlashesProcessedPerBlock = ConstU32<20>;
type WeightInfo (line 271) | type WeightInfo = ();
type SendMessage (line 272) | type SendMessage = MockOkOutboundQueue;
type FullIdentificationOf (line 275) | pub struct FullIdentificationOf;
method convert (line 277) | fn convert(_: AccountId) -> Option<()> {
type FullIdentification (line 283) | type FullIdentification = ();
type FullIdentificationOf (line 284) | type FullIdentificationOf = FullIdentificationOf;
function new_test_ext (line 287) | pub fn new_test_ext() -> sp_io::TestExternalities {
type IdentityValidator (line 294) | pub struct IdentityValidator;
method convert (line 296) | fn convert(a: u64) -> Option<u64> {
type MockInnerReporter (line 306) | pub struct MockInnerReporter;
method set_should_fail (line 309) | pub fn set_should_fail(fail: bool) {
method was_called (line 312) | pub fn was_called() -> bool {
method reset (line 315) | pub fn reset() {
method report_offence (line 322) | fn report_offence(_reporters: Vec<R>, _offence: O) -> Result<(), Offen...
method is_known_offence (line 330) | fn is_known_offence(_offenders: &[Id], _time_slot: &O::TimeSlot) -> bo...
type MockOffence (line 336) | pub struct MockOffence {
constant ID (line 342) | const ID: sp_staking::offence::Kind = *b"mock:offence0000";
type TimeSlot (line 343) | type TimeSlot = u128;
method offenders (line 345) | fn offenders(&self) -> Vec<(u64, ())> {
method session_index (line 348) | fn session_index(&self) -> SessionIndex {
method validator_set_count (line 351) | fn validator_set_count(&self) -> u32 {
method time_slot (line 354) | fn time_slot(&self) -> Self::TimeSlot {
method slash_fraction (line 357) | fn slash_fraction(&self, _offenders_count: u32) -> sp_runtime::Perbill {
type MockBabeWrapper (line 363) | pub type MockBabeWrapper =
type MockGrandpaWrapper (line 367) | pub type MockGrandpaWrapper =
function run_block (line 370) | pub fn run_block() {
constant INIT_TIMESTAMP (line 374) | pub const INIT_TIMESTAMP: u64 = 30_000;
constant BLOCK_TIME (line 375) | pub const BLOCK_TIME: u64 = 1000;
function run_to_block (line 378) | pub fn run_to_block(n: u64) {
FILE: operator/pallets/external-validator-slashes/src/tests.rs
function root_can_inject_manual_offence (line 32) | fn root_can_inject_manual_offence() {
function cannot_inject_future_era_offence (line 60) | fn cannot_inject_future_era_offence() {
function cannot_inject_era_offence_too_far_in_the_past (line 77) | fn cannot_inject_era_offence_too_far_in_the_past() {
function root_can_cancel_deferred_slash (line 95) | fn root_can_cancel_deferred_slash() {
function root_cannot_cancel_deferred_slash_if_outside_deferring_period (line 116) | fn root_cannot_cancel_deferred_slash_if_outside_deferring_period() {
function root_cannot_cancel_out_of_bounds (line 137) | fn root_cannot_cancel_out_of_bounds() {
function root_cannot_cancel_duplicates (line 159) | fn root_cannot_cancel_duplicates() {
function root_cannot_cancel_if_not_sorted (line 177) | fn root_cannot_cancel_if_not_sorted() {
function test_after_bonding_period_we_can_remove_slashes (line 202) | fn test_after_bonding_period_we_can_remove_slashes() {
function test_on_offence_injects_offences (line 243) | fn test_on_offence_injects_offences() {
function test_on_offence_does_not_work_for_invulnerables (line 272) | fn test_on_offence_does_not_work_for_invulnerables() {
function test_on_offence_does_not_work_if_slashing_disabled (line 292) | fn test_on_offence_does_not_work_if_slashing_disabled() {
function defer_period_of_zero_confirms_immediately_slashes (line 320) | fn defer_period_of_zero_confirms_immediately_slashes() {
function we_cannot_cancel_anything_with_defer_period_zero (line 348) | fn we_cannot_cancel_anything_with_defer_period_zero() {
function test_on_offence_defer_period_0 (line 367) | fn test_on_offence_defer_period_0() {
function test_slashes_command_matches_event (line 400) | fn test_slashes_command_matches_event() {
function wad_conversion_100_percent_slash_maps_to_max_slash_wad (line 445) | fn wad_conversion_100_percent_slash_maps_to_max_slash_wad() {
function wad_conversion_50_percent_slash_maps_to_half_max_slash_wad (line 473) | fn wad_conversion_50_percent_slash_maps_to_half_max_slash_wad() {
function wad_conversion_zero_percent_slash_maps_to_zero (line 500) | fn wad_conversion_zero_percent_slash_maps_to_zero() {
function wad_conversion_carries_offence_kind_description (line 526) | fn wad_conversion_carries_offence_kind_description() {
function test_on_offence_defer_period_0_messages_get_queued (line 556) | fn test_on_offence_defer_period_0_messages_get_queued() {
function test_account_id_encoding (line 589) | fn test_account_id_encoding() {
function test_on_offence_defer_period_0_messages_get_queued_across_eras (line 611) | fn test_on_offence_defer_period_0_messages_get_queued_across_eras() {
function on_offence_reads_pending_offence_kind_from_double_map (line 669) | fn on_offence_reads_pending_offence_kind_from_double_map() {
function pending_offence_kind_is_session_isolated (line 704) | fn pending_offence_kind_is_session_isolated() {
function wrapper_filters_historical_offence_before_bonding_period (line 733) | fn wrapper_filters_historical_offence_before_bonding_period() {
function wrapper_sets_pending_offence_kind_per_session_and_offender (line 782) | fn wrapper_sets_pending_offence_kind_per_session_and_offender() {
function wrapper_cleans_up_pending_offence_kind_on_error (line 811) | fn wrapper_cleans_up_pending_offence_kind_on_error() {
function wrapper_error_cleanup_does_not_affect_other_sessions (line 834) | fn wrapper_error_cleanup_does_not_affect_other_sessions() {
function start_era (line 873) | fn start_era(era_index: EraIndex, session_index: SessionIndex, external_...
function get_slashing_era (line 878) | fn get_slashing_era(slash_era: EraIndex) -> EraIndex {
FILE: operator/pallets/external-validator-slashes/src/weights.rs
type WeightInfo (line 55) | pub trait WeightInfo {
method cancel_deferred_slash (line 56) | fn cancel_deferred_slash(s: u32, ) -> Weight;
method force_inject_slash (line 57) | fn force_inject_slash() -> Weight;
method root_test_send_msg_to_eth (line 58) | fn root_test_send_msg_to_eth() -> Weight;
method process_slashes_queue (line 59) | fn process_slashes_queue(s: u32, ) -> Weight;
method set_slashing_mode (line 60) | fn set_slashing_mode() -> Weight;
method cancel_deferred_slash (line 71) | fn cancel_deferred_slash(s: u32, ) -> Weight {
method force_inject_slash (line 88) | fn force_inject_slash() -> Weight {
method root_test_send_msg_to_eth (line 98) | fn root_test_send_msg_to_eth() -> Weight {
method process_slashes_queue (line 126) | fn process_slashes_queue(s: u32, ) -> Weight {
method set_slashing_mode (line 139) | fn set_slashing_mode() -> Weight {
method cancel_deferred_slash (line 154) | fn cancel_deferred_slash(s: u32, ) -> Weight {
method force_inject_slash (line 171) | fn force_inject_slash() -> Weight {
method root_test_send_msg_to_eth (line 181) | fn root_test_send_msg_to_eth() -> Weight {
method process_slashes_queue (line 211) | fn process_slashes_queue(s: u32, ) -> Weight {
method set_slashing_mode (line 224) | fn set_slashing_mode() -> Weight {
type SubstrateWeight (line 64) | pub struct SubstrateWeight<T>(PhantomData<T>);
FILE: operator/pallets/external-validators-rewards/src/benchmarking.rs
constant SEED (line 30) | const SEED: u32 = 0;
function create_funded_user (line 32) | fn create_funded_user<T: Config + pallet_balances::Config>(
function push_unsent_entry (line 47) | fn push_unsent_entry<T: Config>(era_index: u32, timestamp: u32, inflatio...
function on_era_end (line 58) | fn on_era_end() -> Result<(), BenchmarkError> {
function setup_era_reward_points (line 81) | fn setup_era_reward_points<T: Config + pallet_balances::Config>(era_inde...
function process_unsent_reward_eras_empty (line 95) | fn process_unsent_reward_eras_empty() -> Result<(), BenchmarkError> {
function process_unsent_reward_eras_expired (line 109) | fn process_unsent_reward_eras_expired() -> Result<(), BenchmarkError> {
function process_unsent_reward_eras_success (line 126) | fn process_unsent_reward_eras_success() -> Result<(), BenchmarkError> {
function process_unsent_reward_eras_failed (line 145) | fn process_unsent_reward_eras_failed() -> Result<(), BenchmarkError> {
function retry_unsent_reward_era (line 162) | fn retry_unsent_reward_era() -> Result<(), BenchmarkError> {
FILE: operator/pallets/external-validators-rewards/src/lib.rs
type SlashingCheck (line 51) | pub trait SlashingCheck<AccountId> {
method is_slashed (line 52) | fn is_slashed(era_index: u32, validator: &AccountId) -> bool;
function is_slashed (line 57) | fn is_slashed(_era_index: u32, _validator: &AccountId) -> bool {
constant STORAGE_VERSION (line 75) | const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
type RewardPoints (line 77) | pub type RewardPoints = u32;
type EraIndex (line 78) | pub type EraIndex = u32;
type Config (line 81) | pub trait Config: frame_system::Config {
type Pallet (line 179) | pub struct Pallet<T>(_);
function on_initialize (line 183) | fn on_initialize(_n: frame_system::pallet_prelude::BlockNumberFor<T>) ->...
function retry_unsent_reward_era (line 194) | pub fn retry_unsent_reward_era(
type Event (line 239) | pub enum Event<T: Config> {
type Error (line 263) | pub enum Error<T> {
type EraRewardPoints (line 274) | pub struct EraRewardPoints<AccountId> {
function generate_era_rewards_info (line 285) | pub fn generate_era_rewards_info(
method default (line 317) | fn default() -> Self {
type RewardPointsForEra (line 329) | pub type RewardPointsForEra<T: Config> =
type BlocksAuthoredInSession (line 336) | pub type BlocksAuthoredInSession<T: Config> =
type BlocksProducedInEra (line 342) | pub type BlocksProducedInEra<T: Config> =
constant UNSENT_QUEUE_CAPACITY (line 346) | pub const UNSENT_QUEUE_CAPACITY: u32 = 64;
type UnsentRewardEra (line 352) | pub type UnsentRewardEra<T: Config> = StorageMap<
type UnsentRewardHead (line 365) | pub type UnsentRewardHead<T: Config> = StorageValue<_, u32, ValueQuery>;
type UnsentRewardTail (line 370) | pub type UnsentRewardTail<T: Config> = StorageValue<_, u32, ValueQuery>;
function reward_by_ids (line 374) | pub fn reward_by_ids(points: impl IntoIterator<Item = (T::AccountId, Rew...
function send_rewards_message (line 388) | fn send_rewards_message(info: &EraRewardsUtils) -> Option<H256> {
function unsent_queue_is_empty (line 419) | pub(crate) fn unsent_queue_is_empty() -> bool {
function unsent_queue_len (line 425) | pub(crate) fn unsent_queue_len() -> u32 {
function unsent_queue_push (line 433) | pub(crate) fn unsent_queue_push(entry: (EraIndex, u32, u128)) -> bool {
function unsent_queue_remove_slot (line 448) | fn unsent_queue_remove_slot(slot: u32) {
function process_unsent_reward_eras (line 493) | pub(crate) fn process_unsent_reward_eras() -> Weight {
function note_block_author (line 557) | pub fn note_block_author(author: T::AccountId) {
function calculate_scaled_inflation (line 588) | pub fn calculate_scaled_inflation(era_index: EraIndex, base_inflation: u...
function award_session_performance_points (line 662) | pub fn award_session_performance_points(
method on_era_start (line 865) | fn on_era_start(era_index: EraIndex, _session_start: u32, _external_idx:...
method on_era_end (line 894) | fn on_era_end(era_index: EraIndex) {
type SessionPerformanceManager (line 1002) | pub struct SessionPerformanceManager<T, Inner>(core::marker::PhantomData...
function new_session (line 1010) | fn new_session(new_index: SessionIndex) -> Option<Vec<T::AccountId>> {
function new_session_genesis (line 1014) | fn new_session_genesis(new_index: SessionIndex) -> Option<Vec<T::Account...
function start_session (line 1018) | fn start_session(start_index: SessionIndex) {
function end_session (line 1022) | fn end_session(end_index: SessionIndex) {
function new_session (line 1040) | fn new_session(new_index: SessionIndex) -> Option<Vec<(T::AccountId, ())...
function start_session (line 1046) | fn start_session(start_index: SessionIndex) {
function end_session (line 1052) | fn end_session(end_index: SessionIndex) {
function note_author (line 1070) | fn note_author(author: T::AccountId) {
FILE: operator/pallets/external-validators-rewards/src/mock.rs
type Block (line 34) | type Block = frame_system::mocking::MockBlock<Test>;
constant TREASURY_ACCOUNT (line 37) | pub const TREASURY_ACCOUNT: H160 = H160([0xAA; 20]);
constant REWARDS_ACCOUNT (line 40) | pub const REWARDS_ACCOUNT: H160 = H160([0xFF; 20]);
type BaseCallFilter (line 61) | type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights (line 62) | type BlockWeights = ();
type BlockLength (line 63) | type BlockLength = ();
type DbWeight (line 64) | type DbWeight = ();
type RuntimeOrigin (line 65) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 66) | type RuntimeCall = RuntimeCall;
type Hash (line 67) | type Hash = H256;
type Hashing (line 68) | type Hashing = BlakeTwo256;
type AccountId (line 69) | type AccountId = H160;
type Lookup (line 70) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 71) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 72) | type BlockHashCount = BlockHashCount;
type Version (line 73) | type Version = ();
type PalletInfo (line 74) | type PalletInfo = PalletInfo;
type AccountData (line 75) | type AccountData = AccountData<u128>;
type OnNewAccount (line 76) | type OnNewAccount = ();
type OnKilledAccount (line 77) | type OnKilledAccount = ();
type SystemWeightInfo (line 78) | type SystemWeightInfo = ();
type SS58Prefix (line 79) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 80) | type OnSetCode = ();
type MaxConsumers (line 81) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type Nonce (line 82) | type Nonce = u64;
type Block (line 83) | type Block = Block;
type RuntimeTask (line 84) | type RuntimeTask = ();
type SingleBlockMigrations (line 85) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 86) | type MultiBlockMigrator = ();
type PreInherents (line 87) | type PreInherents = ();
type PostInherents (line 88) | type PostInherents = ();
type PostTransactions (line 89) | type PostTransactions = ();
type ExtensionsWeightInfo (line 90) | type ExtensionsWeightInfo = ();
type RuntimeEvent (line 99) | type RuntimeEvent = RuntimeEvent;
type WeightInfo (line 100) | type WeightInfo = ();
type Balance (line 101) | type Balance = u128;
type DustRemoval (line 102) | type DustRemoval = ();
type ExistentialDeposit (line 103) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 104) | type AccountStore = System;
type ReserveIdentifier (line 105) | type ReserveIdentifier = [u8; 8];
type RuntimeHoldReason (line 106) | type RuntimeHoldReason = ();
type RuntimeFreezeReason (line 107) | type RuntimeFreezeReason = ();
type FreezeIdentifier (line 108) | type FreezeIdentifier = ();
type MaxLocks (line 109) | type MaxLocks = ();
type MaxReserves (line 110) | type MaxReserves = MaxReserves;
type MaxFreezes (line 111) | type MaxFreezes = ConstU32<0>;
type DoneSlashHandler (line 112) | type DoneSlashHandler = ();
type Moment (line 116) | type Moment = u64;
type OnTimestampSet (line 117) | type OnTimestampSet = ();
type MinimumPeriod (line 118) | type MinimumPeriod = ConstU64<5>;
type WeightInfo (line 119) | type WeightInfo = ();
type MockOkOutboundQueue (line 124) | pub struct MockOkOutboundQueue;
type Ticket (line 126) | type Ticket = crate::types::EraRewardsUtils;
type Message (line 127) | type Message = crate::types::EraRewardsUtils;
method build (line 129) | fn build(utils: &crate::types::EraRewardsUtils) -> Option<Self::Ticket> {
method validate (line 133) | fn validate(ticket: Self::Ticket) -> Result<Self::Ticket, SendError> {
method deliver (line 140) | fn deliver(_: Self::Ticket) -> Result<H256, SendError> {
type Balance (line 146) | type Balance = u128;
method local_fee (line 148) | fn local_fee() -> Self::Balance {
type TimestampProvider (line 153) | pub struct TimestampProvider;
method get_external_index (line 155) | fn get_external_index() -> u64 {
type MockValidatorSet (line 182) | pub struct MockValidatorSet;
type ValidatorId (line 184) | type ValidatorId = H160;
type ValidatorIdOf (line 185) | type ValidatorIdOf = sp_runtime::traits::ConvertInto;
method session_index (line 187) | fn session_index() -> sp_staking::SessionIndex {
method validators (line 191) | fn validators() -> Vec<Self::ValidatorId> {
type MockSlashingCheck (line 199) | pub struct MockSlashingCheck;
method is_slashed (line 201) | fn is_slashed(era_index: u32, validator: &H160) -> bool {
type RuntimeEvent (line 209) | type RuntimeEvent = RuntimeEvent;
type EraIndexProvider (line 210) | type EraIndexProvider = mock_data::Pallet<Test>;
type HistoryDepth (line 211) | type HistoryDepth = ConstU32<10>;
type EraInflationProvider (line 212) | type EraInflationProvider = EraInflationProvider;
type ExternalIndexProvider (line 213) | type ExternalIndexProvider = TimestampProvider;
type GetWhitelistedValidators (line 214) | type GetWhitelistedValidators = ();
type ValidatorSet (line 215) | type ValidatorSet = MockValidatorSet;
type SlashingCheck (line 216) | type SlashingCheck = MockSlashingCheck;
type BasePointsPerBlock (line 217) | type BasePointsPerBlock = BasePointsPerBlock;
type BlockAuthoringWeight (line 218) | type BlockAuthoringWeight = BlockAuthoringWeight;
type LivenessWeight (line 219) | type LivenessWeight = LivenessWeight;
type FairShareCap (line 220) | type FairShareCap = FairShareCap;
type ExpectedBlocksPerEra (line 221) | type ExpectedBlocksPerEra = ExpectedBlocksPerEra;
type MinInflationPercent (line 222) | type MinInflationPercent = MinInflationPercent;
type MaxInflationPercent (line 223) | type MaxInflationPercent = MaxInflationPercent;
type Hashing (line 224) | type Hashing = Keccak256;
type SendMessage (line 225) | type SendMessage = MockOkOutboundQueue;
type HandleInflation (line 226) | type HandleInflation = InflationMinter;
type Currency (line 227) | type Currency = Balances;
type RewardsEthereumSovereignAccount (line 228) | type RewardsEthereumSovereignAccount = RewardsEthereumSovereignAccount;
type GovernanceOrigin (line 229) | type GovernanceOrigin = frame_system::EnsureRoot<H160>;
type WeightInfo (line 230) | type WeightInfo = ();
type BenchmarkHelper (line 232) | type BenchmarkHelper = ();
type InflationMinter (line 235) | pub struct InflationMinter;
method mint_inflation (line 237) | fn mint_inflation(
type Mocks (line 292) | pub struct Mocks {
type Config (line 304) | pub trait Config: frame_system::Config {}
type Pallet (line 311) | pub struct Pallet<T>(_);
type Mock (line 314) | pub(super) type Mock<T: Config> = StorageValue<_, Mocks, ValueQuery>;
function mock (line 317) | pub fn mock() -> Mocks {
function mutate (line 321) | pub fn mutate<F, R>(f: F) -> R
method active_era (line 330) | fn active_era() -> ActiveEraInfo {
method era_to_session_start (line 337) | fn era_to_session_start(_era_index: EraIndex) -> Option<u32> {
function new_test_ext (line 343) | pub fn new_test_ext() -> sp_io::TestExternalities {
constant INIT_TIMESTAMP (line 369) | pub const INIT_TIMESTAMP: u64 = 30_000;
constant BLOCK_TIME (line 370) | pub const BLOCK_TIME: u64 = 1000;
function run_to_block (line 372) | pub fn run_to_block(n: u64) {
function end_session (line 383) | pub fn end_session(session_index: u32, validators: Vec<H160>, whiteliste...
FILE: operator/pallets/external-validators-rewards/src/tests.rs
function basic_setup_works (line 26) | fn basic_setup_works() {
function can_reward_validators (line 36) | fn can_reward_validators() {
function history_limit (line 70) | fn history_limit() {
function history_limit_blocks_produced (line 101) | fn history_limit_blocks_produced() {
function test_on_era_end (line 130) | fn test_on_era_end() {
function test_on_era_end_with_zero_inflation (line 182) | fn test_on_era_end_with_zero_inflation() {
function test_on_era_end_with_zero_points (line 225) | fn test_on_era_end_with_zero_points() {
function test_inflation_minting (line 273) | fn test_inflation_minting() {
function test_inflation_calculation_with_different_rates (line 326) | fn test_inflation_calculation_with_different_rates() {
function test_no_inflation_with_zero_points (line 369) | fn test_no_inflation_with_zero_points() {
function test_inflation_calculation_accuracy (line 399) | fn test_inflation_calculation_accuracy() {
function test_performance_multiplier_with_full_participation (line 444) | fn test_performance_multiplier_with_full_participation() {
function test_performance_multiplier_with_partial_participation (line 500) | fn test_performance_multiplier_with_partial_participation() {
function test_performance_multiplier_with_zero_participation (line 553) | fn test_performance_multiplier_with_zero_participation() {
function test_inflation_calculation_precision_with_multiplier (line 592) | fn test_inflation_calculation_precision_with_multiplier() {
function test_multiple_eras_with_varying_participation (line 643) | fn test_multiple_eras_with_varying_participation() {
function test_weighting_formula_60_30_10 (line 729) | fn test_weighting_formula_60_30_10() {
function test_treasury_receives_20_percent_of_inflation (line 803) | fn test_treasury_receives_20_percent_of_inflation() {
function test_treasury_allocation_with_different_amounts (line 865) | fn test_treasury_allocation_with_different_amounts() {
function test_treasury_allocation_maintains_precision (line 922) | fn test_treasury_allocation_maintains_precision() {
function test_single_validator_network (line 976) | fn test_single_validator_network() {
function test_very_large_inflation_no_overflow (line 1008) | fn test_very_large_inflation_no_overflow() {
function test_very_small_inflation_amounts (line 1052) | fn test_very_small_inflation_amounts() {
function test_uneven_validator_participation (line 1092) | fn test_uneven_validator_participation() {
function test_performance_multiplier_gradual_degradation (line 1134) | fn test_performance_multiplier_gradual_degradation() {
function test_alternating_participation_patterns (line 1199) | fn test_alternating_participation_patterns() {
function test_consistent_inflation_across_eras (line 1265) | fn test_consistent_inflation_across_eras() {
function test_no_unexpected_balance_changes (line 1313) | fn test_no_unexpected_balance_changes() {
function test_total_issuance_increases_correctly (line 1347) | fn test_total_issuance_increases_correctly() {
function test_session_performance_block_authorship_tracking (line 1394) | fn test_session_performance_block_authorship_tracking() {
function test_session_performance_60_30_10_formula (line 1436) | fn test_session_performance_60_30_10_formula() {
function test_session_performance_whitelisted_validators_excluded (line 1503) | fn test_session_performance_whitelisted_validators_excluded() {
function test_session_performance_whitelisted_fair_share_calculation (line 1557) | fn test_session_performance_whitelisted_fair_share_calculation() {
function test_session_performance_block_count_reset_per_session (line 1651) | fn test_session_performance_block_count_reset_per_session() {
function test_session_performance_zero_total_blocks (line 1689) | fn test_session_performance_zero_total_blocks() {
function test_session_performance_fair_share_capping (line 1728) | fn test_session_performance_fair_share_capping() {
function test_session_performance_single_validator (line 1777) | fn test_session_performance_single_validator() {
function test_session_performance_no_active_validators (line 1814) | fn test_session_performance_no_active_validators() {
function test_session_performance_checked_math_division (line 1840) | fn test_session_performance_checked_math_division() {
function test_session_performance_multiple_sessions_cumulative (line 1902) | fn test_session_performance_multiple_sessions_cumulative() {
function test_session_performance_base_reward_points_config (line 1952) | fn test_session_performance_base_reward_points_config() {
function test_inflation_scaling_zero_blocks_produced (line 1991) | fn test_inflation_scaling_zero_blocks_produced() {
function test_inflation_scaling_half_expected_blocks (line 2040) | fn test_inflation_scaling_half_expected_blocks() {
function test_inflation_scaling_full_expected_blocks (line 2091) | fn test_inflation_scaling_full_expected_blocks() {
function test_inflation_scaling_overproduction_capped (line 2142) | fn test_inflation_scaling_overproduction_capped() {
function test_inflation_scaling_quarter_blocks (line 2193) | fn test_inflation_scaling_quarter_blocks() {
function test_inflation_scaling_three_quarters_blocks (line 2232) | fn test_inflation_scaling_three_quarters_blocks() {
function test_inflation_scaling_blocks_tracked_per_era (line 2271) | fn test_inflation_scaling_blocks_tracked_per_era() {
function test_inflation_scaling_multiple_eras_different_performance (line 2321) | fn test_inflation_scaling_multiple_eras_different_performance() {
function test_inflation_scaling_precision_with_large_numbers (line 2392) | fn test_inflation_scaling_precision_with_large_numbers() {
function test_inflation_scaling_with_zero_points_no_minting (line 2441) | fn test_inflation_scaling_with_zero_points_no_minting() {
function test_inflation_scaling_block_counter_increments_correctly (line 2475) | fn test_inflation_scaling_block_counter_increments_correctly() {
function test_inflation_scaling_different_validators_same_era (line 2504) | fn test_inflation_scaling_different_validators_same_era() {
function test_session_performance_offline_validator_gets_reduced_points (line 2540) | fn test_session_performance_offline_validator_gets_reduced_points() {
function test_session_performance_all_validators_offline (line 2607) | fn test_session_performance_all_validators_offline() {
function test_session_performance_offline_but_authored_blocks (line 2653) | fn test_session_performance_offline_but_authored_blocks() {
function test_session_performance_offline_validator_zero_blocks (line 2707) | fn test_session_performance_offline_validator_zero_blocks() {
function test_session_performance_weight_overflow_handled (line 2757) | fn test_session_performance_weight_overflow_handled() {
function test_slashing_check_mock_works (line 2807) | fn test_slashing_check_mock_works() {
function test_session_performance_slashed_validator_still_gets_points_when_disabled (line 2840) | fn test_session_performance_slashed_validator_still_gets_points_when_dis...
function test_fair_share_non_integer_division_rounding (line 2896) | fn test_fair_share_non_integer_division_rounding() {
function test_all_validators_whitelisted_no_panic (line 2949) | fn test_all_validators_whitelisted_no_panic() {
function test_blocks_less_than_validators (line 2989) | fn test_blocks_less_than_validators() {
function test_single_block_many_validators (line 3042) | fn test_single_block_many_validators() {
function test_perbill_precision_many_sessions (line 3098) | fn test_perbill_precision_many_sessions() {
function test_history_depth_exact_boundary (line 3168) | fn test_history_depth_exact_boundary() {
function test_total_points_sum_equals_expected_pool (line 3215) | fn test_total_points_sum_equals_expected_pool() {
function test_total_points_with_uneven_distribution (line 3269) | fn test_total_points_with_uneven_distribution() {
function test_whitelisted_overproducer_does_not_affect_nonwhitelisted (line 3352) | fn test_whitelisted_overproducer_does_not_affect_nonwhitelisted() {
function test_whitelisted_majority_fair_share_calculation (line 3411) | fn test_whitelisted_majority_fair_share_calculation() {
function test_large_block_count_no_overflow (line 3477) | fn test_large_block_count_no_overflow() {
function test_saturating_arithmetic_protection (line 3532) | fn test_saturating_arithmetic_protection() {
function test_multiple_sessions_accumulate_to_era_correctly (line 3576) | fn test_multiple_sessions_accumulate_to_era_correctly() {
function test_era_end_uses_correct_era_blocks_not_session (line 3670) | fn test_era_end_uses_correct_era_blocks_not_session() {
function push_unsent (line 3731) | fn push_unsent(era_index: u32, timestamp: u32, inflation: u128) {
function unsent_len (line 3739) | fn unsent_len() -> u32 {
function unsent_is_empty (line 3744) | fn unsent_is_empty() -> bool {
function send_failure_queues_era (line 3749) | fn send_failure_queues_era() {
function on_initialize_retries_and_succeeds (line 3781) | fn on_initialize_retries_and_succeeds() {
function on_initialize_moves_failed_entry_to_back (line 3818) | fn on_initialize_moves_failed_entry_to_back() {
function on_initialize_removes_expired_era (line 3876) | fn on_initialize_removes_expired_era() {
function on_initialize_noop_when_queue_empty (line 3897) | fn on_initialize_noop_when_queue_empty() {
function on_initialize_processes_only_head (line 3914) | fn on_initialize_processes_only_head() {
function retry_extrinsic_success (line 3948) | fn retry_extrinsic_success() {
function retry_extrinsic_era_not_in_queue (line 3987) | fn retry_extrinsic_era_not_in_queue() {
function retry_extrinsic_pruned_data (line 3999) | fn retry_extrinsic_pruned_data() {
function retry_extrinsic_requires_root (line 4014) | fn retry_extrinsic_requires_root() {
function unsent_queue_full (line 4029) | fn unsent_queue_full() {
function on_era_start_prunes_unsent_entry (line 4068) | fn on_era_start_prunes_unsent_entry() {
function retry_extrinsic_send_still_fails (line 4090) | fn retry_extrinsic_send_still_fails() {
function head_of_line_blocking_avoided (line 4119) | fn head_of_line_blocking_avoided() {
FILE: operator/pallets/external-validators-rewards/src/types.rs
type EraRewardsUtils (line 23) | pub struct EraRewardsUtils {
type SendMessage (line 31) | pub trait SendMessage {
method build (line 35) | fn build(utils: &EraRewardsUtils) -> Option<Self::Message>;
method validate (line 37) | fn validate(message: Self::Message) -> Result<Self::Ticket, SendError>;
method deliver (line 39) | fn deliver(ticket: Self::Ticket) -> Result<H256, SendError>;
type InflationMintResult (line 44) | pub struct InflationMintResult {
type HandleInflation (line 52) | pub trait HandleInflation<AccountId> {
method mint_inflation (line 55) | fn mint_inflation(
function mint_inflation (line 62) | fn mint_inflation(
type BenchmarkHelper (line 74) | pub trait BenchmarkHelper {
method setup (line 75) | fn setup();
method setup (line 80) | fn setup() {
FILE: operator/pallets/external-validators-rewards/src/weights.rs
type WeightInfo (line 55) | pub trait WeightInfo {
method on_era_end (line 56) | fn on_era_end() -> Weight;
method process_unsent_reward_eras_empty (line 57) | fn process_unsent_reward_eras_empty() -> Weight;
method process_unsent_reward_eras_expired (line 58) | fn process_unsent_reward_eras_expired() -> Weight;
method process_unsent_reward_eras_success (line 59) | fn process_unsent_reward_eras_success() -> Weight;
method process_unsent_reward_eras_failed (line 60) | fn process_unsent_reward_eras_failed() -> Weight;
method retry_unsent_reward_era (line 61) | fn retry_unsent_reward_era() -> Weight;
method on_era_end (line 83) | fn on_era_end() -> Weight {
method process_unsent_reward_eras_empty (line 93) | fn process_unsent_reward_eras_empty() -> Weight {
method process_unsent_reward_eras_expired (line 99) | fn process_unsent_reward_eras_expired() -> Weight {
method process_unsent_reward_eras_success (line 106) | fn process_unsent_reward_eras_success() -> Weight {
method process_unsent_reward_eras_failed (line 113) | fn process_unsent_reward_eras_failed() -> Weight {
method retry_unsent_reward_era (line 118) | fn retry_unsent_reward_era() -> Weight {
method on_era_end (line 142) | fn on_era_end() -> Weight {
method process_unsent_reward_eras_empty (line 152) | fn process_unsent_reward_eras_empty() -> Weight {
method process_unsent_reward_eras_expired (line 157) | fn process_unsent_reward_eras_expired() -> Weight {
method process_unsent_reward_eras_success (line 163) | fn process_unsent_reward_eras_success() -> Weight {
method process_unsent_reward_eras_failed (line 169) | fn process_unsent_reward_eras_failed() -> Weight {
method retry_unsent_reward_era (line 173) | fn retry_unsent_reward_era() -> Weight {
type SubstrateWeight (line 65) | pub struct SubstrateWeight<T>(PhantomData<T>);
FILE: operator/pallets/external-validators/src/benchmarking.rs
constant SEED (line 32) | const SEED: u32 = 0;
function assert_last_event (line 34) | fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEve...
function create_funded_user (line 42) | fn create_funded_user<T: Config + pallet_balances::Config>(
type InputFromRng (line 56) | struct InputFromRng<'a, T>(&'a mut T);
function remaining_len (line 58) | fn remaining_len(&mut self) -> Result<Option<usize>, codec::Error> {
function read (line 62) | fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> {
function keys (line 68) | fn keys<T: Config + session::Config>(c: u32) -> <T as session::Config>::...
function invulnerable (line 74) | fn invulnerable<T: Config + session::Config + pallet_balances::Config>(
function invulnerables (line 87) | fn invulnerables<
function skip_external_validators (line 110) | fn skip_external_validators() -> Result<(), BenchmarkError> {
function add_whitelisted (line 121) | fn add_whitelisted(
function remove_whitelisted (line 158) | fn remove_whitelisted(
function force_era (line 187) | fn force_era() -> Result<(), BenchmarkError> {
function set_external_validators (line 198) | fn set_external_validators() -> Result<(), BenchmarkError> {
function new_session (line 216) | fn new_session(
FILE: operator/pallets/external-validators/src/lib.rs
type Config (line 109) | pub trait Config: frame_system::Config {
type Pallet (line 180) | pub struct Pallet<T>(_);
type WhitelistedValidators (line 184) | pub type WhitelistedValidators<T: Config> =
type WhitelistedValidatorsActiveEra (line 190) | pub type WhitelistedValidatorsActiveEra<T: Config> =
type WhitelistedValidatorsActiveEraPending (line 196) | pub type WhitelistedValidatorsActiveEraPending<T: Config> =
type ExternalValidators (line 201) | pub type ExternalValidators<T: Config> =
type SkipExternalValidators (line 206) | pub type SkipExternalValidators<T: Config> = StorageValue<_, bool, Value...
type CurrentEra (line 210) | pub type CurrentEra<T: Config> = StorageValue<_, EraIndex>;
type ActiveEra (line 214) | pub type ActiveEra<T: Config> = StorageValue<_, ActiveEraInfo>;
type ErasStartSessionIndex (line 221) | pub type ErasStartSessionIndex<T> = StorageMap<_, Twox64Concat, EraIndex...
type ForceEra (line 225) | pub type ForceEra<T> = StorageValue<_, Forcing, ValueQuery>;
type ExternalIndex (line 231) | pub type ExternalIndex<T> = StorageValue<_, u64, ValueQuery>;
type PendingExternalIndex (line 235) | pub type PendingExternalIndex<T> = StorageValue<_, u64, ValueQuery>;
type CurrentExternalIndex (line 239) | pub type CurrentExternalIndex<T> = StorageValue<_, u64, ValueQuery>;
type GenesisConfig (line 243) | pub struct GenesisConfig<T: Config> {
method build (line 251) | fn build(&self) {
type Event (line 284) | pub enum Event<T: Config> {
type Error (line 301) | pub enum Error<T> {
function skip_external_validators (line 327) | pub fn skip_external_validators(origin: OriginFor<T>, skip: bool) -> Dis...
function add_whitelisted (line 342) | pub fn add_whitelisted(
function remove_whitelisted (line 380) | pub fn remove_whitelisted(origin: OriginFor<T>, who: T::AccountId) -> Di...
function force_era (line 402) | pub fn force_era(origin: OriginFor<T>, mode: Forcing) -> DispatchResult {
function set_external_validators (line 412) | pub fn set_external_validators(
function set_external_validators_inner (line 424) | pub fn set_external_validators_inner(
function validate_target_era (line 443) | fn validate_target_era(target_era: u64) -> DispatchResult {
function set_force_era (line 465) | pub(crate) fn set_force_era(mode: Forcing) {
function whitelisted_validators (line 471) | pub fn whitelisted_validators() -> Vec<T::ValidatorId> {
function active_era (line 475) | pub fn active_era() -> Option<ActiveEraInfo> {
function current_era (line 479) | pub fn current_era() -> Option<EraIndex> {
function eras_start_session_index (line 483) | pub fn eras_start_session_index(era: EraIndex) -> Option<u32> {
function validators (line 490) | pub fn validators() -> Vec<T::ValidatorId> {
function new_session (line 501) | pub(crate) fn new_session(session_index: SessionIndex) -> Option<Vec<T::...
function start_session (line 545) | pub(crate) fn start_session(start_session: SessionIndex) {
function end_session (line 566) | pub(crate) fn end_session(session_index: SessionIndex) {
function start_era (line 583) | pub(crate) fn start_era(start_session: SessionIndex) {
function end_era (line 607) | pub(crate) fn end_era(active_era: ActiveEraInfo, _session_index: Session...
function trigger_new_era (line 619) | pub fn trigger_new_era(start_session_index: SessionIndex) -> Vec<T::Vali...
function try_trigger_new_era (line 646) | pub(crate) fn try_trigger_new_era(
function clear_era_information (line 653) | pub(crate) fn clear_era_information(era_index: EraIndex) {
function on_initialize (line 660) | fn on_initialize(_now: BlockNumberFor<T>) -> Weight {
function on_finalize (line 665) | fn on_finalize(_n: BlockNumberFor<T>) {
method get_external_index (line 681) | fn get_external_index() -> u64 {
function remove_duplicates (line 688) | fn remove_duplicates<T: Ord + Clone>(input: Vec<T>) -> Vec<T> {
function new_session (line 702) | fn new_session(new_index: SessionIndex) -> Option<Vec<T::ValidatorId>> {
function new_session_genesis (line 706) | fn new_session_genesis(new_index: SessionIndex) -> Option<Vec<T::Validat...
function start_session (line 714) | fn start_session(start_index: SessionIndex) {
function end_session (line 718) | fn end_session(end_index: SessionIndex) {
function new_session (line 725) | fn new_session(new_index: SessionIndex) -> Option<Vec<(T::ValidatorId, (...
function start_session (line 730) | fn start_session(start_index: SessionIndex) {
function end_session (line 734) | fn end_session(end_index: SessionIndex) {
method active_era (line 740) | fn active_era() -> ActiveEraInfo {
method era_to_session_start (line 747) | fn era_to_session_start(era_index: EraIndex) -> Option<u32> {
function validators (line 753) | fn validators() -> Vec<T::ValidatorId> {
function invulnerables (line 759) | fn invulnerables() -> Vec<T::ValidatorId> {
type Forcing (line 768) | pub enum Forcing {
FILE: operator/pallets/external-validators/src/mock.rs
type Block (line 36) | type Block = frame_system::mocking::MockBlock<Test>;
type BaseCallFilter (line 59) | type BaseCallFilter = frame_support::traits::Everything;
type BlockWeights (line 60) | type BlockWeights = ();
type BlockLength (line 61) | type BlockLength = ();
type DbWeight (line 62) | type DbWeight = ();
type RuntimeOrigin (line 63) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 64) | type RuntimeCall = RuntimeCall;
type Hash (line 65) | type Hash = H256;
type Hashing (line 66) | type Hashing = BlakeTwo256;
type AccountId (line 67) | type AccountId = u64;
type Lookup (line 68) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 69) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 70) | type BlockHashCount = BlockHashCount;
type Version (line 71) | type Version = ();
type PalletInfo (line 72) | type PalletInfo = PalletInfo;
type AccountData (line 73) | type AccountData = AccountData<u64>;
type OnNewAccount (line 74) | type OnNewAccount = ();
type OnKilledAccount (line 75) | type OnKilledAccount = ();
type SystemWeightInfo (line 76) | type SystemWeightInfo = ();
type SS58Prefix (line 77) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 78) | type OnSetCode = ();
type MaxConsumers (line 79) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type Nonce (line 80) | type Nonce = u64;
type Block (line 81) | type Block = Block;
type RuntimeTask (line 82) | type RuntimeTask = ();
type SingleBlockMigrations (line 83) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 84) | type MultiBlockMigrator = ();
type PreInherents (line 85) | type PreInherents = ();
type PostInherents (line 86) | type PostInherents = ();
type PostTransactions (line 87) | type PostTransactions = ();
type ExtensionsWeightInfo (line 88) | type ExtensionsWeightInfo = ();
type RuntimeEvent (line 97) | type RuntimeEvent = RuntimeEvent;
type WeightInfo (line 98) | type WeightInfo = ();
type Balance (line 99) | type Balance = u64;
type DustRemoval (line 100) | type DustRemoval = ();
type ExistentialDeposit (line 101) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 102) | type AccountStore = System;
type ReserveIdentifier (line 103) | type ReserveIdentifier = [u8; 8];
type RuntimeHoldReason (line 104) | type RuntimeHoldReason = ();
type RuntimeFreezeReason (line 105) | type RuntimeFreezeReason = ();
type FreezeIdentifier (line 106) | type FreezeIdentifier = ();
type MaxLocks (line 107) | type MaxLocks = ();
type MaxReserves (line 108) | type MaxReserves = MaxReserves;
type MaxFreezes (line 109) | type MaxFreezes = ConstU32<0>;
type DoneSlashHandler (line 110) | type DoneSlashHandler = ();
type Moment (line 114) | type Moment = u64;
type OnTimestampSet (line 115) | type OnTimestampSet = ();
type MinimumPeriod (line 116) | type MinimumPeriod = ConstU64<5>;
type WeightInfo (line 117) | type WeightInfo = ();
type IsRegistered (line 124) | pub struct IsRegistered;
method is_registered (line 126) | fn is_registered(id: &u64) -> bool {
method from (line 162) | fn from(aura: sp_runtime::testing::UintAuthorityId) -> Self {
type TestSessionHandler (line 172) | pub struct TestSessionHandler;
constant KEY_TYPE_IDS (line 174) | const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthority...
method on_genesis_session (line 175) | fn on_genesis_session<Ks: OpaqueKeys>(keys: &[(u64, Ks)]) {
method on_new_session (line 178) | fn on_new_session<Ks: OpaqueKeys>(_: bool, keys: &[(u64, Ks)], _: &[(u...
method on_before_session_ending (line 182) | fn on_before_session_ending() {}
method on_disabled (line 183) | fn on_disabled(_: u32) {}
type RuntimeEvent (line 192) | type RuntimeEvent = RuntimeEvent;
type ValidatorId (line 193) | type ValidatorId = <Self as frame_system::Config>::AccountId;
type ValidatorIdOf (line 195) | type ValidatorIdOf = ConvertInto;
type ShouldEndSession (line 196) | type ShouldEndSession = pallet_session::PeriodicSessions<Period, Offset>;
type NextSessionRotation (line 197) | type NextSessionRotation = pallet_session::PeriodicSessions<Period, Offs...
type SessionManager (line 198) | type SessionManager = ExternalValidators;
type SessionHandler (line 199) | type SessionHandler = TestSessionHandler;
type Keys (line 200) | type Keys = MockSessionKeys;
type WeightInfo (line 201) | type WeightInfo = ();
type Config (line 210) | pub trait Config: frame_system::Config {}
type RuntimeEvent (line 136) | type RuntimeEvent = RuntimeEvent;
type UpdateOrigin (line 137) | type UpdateOrigin = EnsureSignedBy<RootAccount, u64>;
type HistoryDepth (line 138) | type HistoryDepth = ConstU32<84>;
type MaxWhitelistedValidators (line 139) | type MaxWhitelistedValidators = ConstU32<20>;
type MaxExternalValidators (line 140) | type MaxExternalValidators = ConstU32<20>;
type ValidatorId (line 141) | type ValidatorId = <Self as frame_system::Config>::AccountId;
type ValidatorIdOf (line 142) | type ValidatorIdOf = ConvertInto;
type ValidatorRegistration (line 143) | type ValidatorRegistration = IsRegistered;
type UnixTime (line 144) | type UnixTime = Timestamp;
type SessionsPerEra (line 145) | type SessionsPerEra = SessionsPerEra;
type OnEraStart (line 146) | type OnEraStart = Mock;
type OnEraEnd (line 147) | type OnEraEnd = Mock;
type AuthorizedOrigin (line 148) | type AuthorizedOrigin = MockAuthorizedOrigin;
type WeightInfo (line 149) | type WeightInfo = ();
type Currency (line 151) | type Currency = Balances;
type Pallet (line 217) | pub struct Pallet<T>(_);
type Mock (line 220) | pub(super) type Mock<T: Config> = StorageValue<_, Mocks, ValueQuery>;
function mock (line 223) | pub fn mock() -> Mocks {
function mutate (line 226) | pub fn mutate<F, R>(f: F) -> R
type HookCall (line 236) | pub enum HookCall {
type Mocks (line 252) | pub struct Mocks {
method on_era_start (line 259) | fn on_era_start(era_index: EraIndex, session_start: u32, external_idx: u...
method on_era_end (line 271) | fn on_era_end(era_index: EraIndex) {
function new_test_ext (line 278) | pub fn new_test_ext() -> sp_io::TestExternalities {
function initialize_validators (line 323) | fn initialize_validators(validators: Vec<u64>) {
constant INIT_TIMESTAMP (line 334) | pub const INIT_TIMESTAMP: u64 = 30_000;
constant BLOCK_TIME (line 335) | pub const BLOCK_TIME: u64 = 1000;
function run_to_session (line 337) | pub fn run_to_session(n: u32) {
function run_to_block (line 342) | pub fn run_to_block(n: u64) {
function last_event (line 358) | pub fn last_event() -> RuntimeEvent {
FILE: operator/pallets/external-validators/src/tests.rs
function basic_setup_works (line 31) | fn basic_setup_works() {
function add_whitelisted_works (line 38) | fn add_whitelisted_works() {
function add_whitelisted_does_not_work_if_not_registered (line 74) | fn add_whitelisted_does_not_work_if_not_registered() {
function validator_limit_works (line 88) | fn validator_limit_works() {
function remove_whitelisted_works (line 115) | fn remove_whitelisted_works() {
function whitelisted_and_external_order (line 159) | fn whitelisted_and_external_order() {
function validator_provider_returns_all_validators (line 177) | fn validator_provider_returns_all_validators() {
function can_skip_external_validators (line 194) | fn can_skip_external_validators() {
function duplicate_validators_are_deduplicated (line 214) | fn duplicate_validators_are_deduplicated() {
function duplicate_validator_order_is_preserved (line 230) | fn duplicate_validator_order_is_preserved() {
function external_index_gets_set_correctly (line 268) | fn external_index_gets_set_correctly() {
function setting_external_validators_emits_event (line 285) | fn setting_external_validators_emits_event() {
function setting_external_validators_with_more_than_max_external_validators_emits_correct_event (line 301) | fn setting_external_validators_with_more_than_max_external_validators_em...
function era_hooks (line 320) | fn era_hooks() {
function target_era_validation_accepts_next_era (line 349) | fn target_era_validation_accepts_next_era() {
function target_era_validation_rejects_old_era (line 363) | fn target_era_validation_rejects_old_era() {
function target_era_validation_rejects_too_new_era (line 383) | fn target_era_validation_rejects_too_new_era() {
function target_era_validation_rejects_duplicate (line 397) | fn target_era_validation_rejects_duplicate() {
function target_era_validation_at_genesis (line 417) | fn target_era_validation_at_genesis() {
function era_hooks_with_external_index (line 434) | fn era_hooks_with_external_index() {
function set_external_validators_extrinsic_rejects_bad_origin (line 480) | fn set_external_validators_extrinsic_rejects_bad_origin() {
function target_era_validation_rejects_u64_max (line 510) | fn target_era_validation_rejects_u64_max() {
function era_boundary_race_submit_advance_resubmit (line 521) | fn era_boundary_race_submit_advance_resubmit() {
function era_boundary_race_resubmit_without_advance (line 541) | fn era_boundary_race_resubmit_without_advance() {
FILE: operator/pallets/external-validators/src/traits.rs
type ActiveEraInfo (line 26) | pub struct ActiveEraInfo {
type EraIndex (line 37) | pub type EraIndex = u32;
type EraIndexProvider (line 40) | pub trait EraIndexProvider {
method active_era (line 41) | fn active_era() -> ActiveEraInfo;
method era_to_session_start (line 42) | fn era_to_session_start(era_index: EraIndex) -> Option<u32>;
type ValidatorProvider (line 46) | pub trait ValidatorProvider<ValidatorId> {
method validators (line 47) | fn validators() -> Vec<ValidatorId>;
type InvulnerablesProvider (line 51) | pub trait InvulnerablesProvider<ValidatorId> {
method invulnerables (line 52) | fn invulnerables() -> Vec<ValidatorId>;
type OnEraStart (line 55) | pub trait OnEraStart {
method on_era_start (line 56) | fn on_era_start(_era_index: EraIndex, _session_start: u32, _external_i...
method on_era_start (line 61) | fn on_era_start(era_index: EraIndex, session_start: u32, external_idx:...
type OnEraEnd (line 66) | pub trait OnEraEnd {
method on_era_end (line 67) | fn on_era_end(_era_index: EraIndex) {}
method on_era_end (line 72) | fn on_era_end(era_index: EraIndex) {
type ExternalIndexProvider (line 80) | pub trait ExternalIndexProvider {
method get_external_index (line 81) | fn get_external_index() -> u64;
type DeliverMessage (line 84) | pub trait DeliverMessage {
method deliver (line 87) | fn deliver(ticket: Self::Ticket) -> Result<H256, SendError>;
FILE: operator/pallets/external-validators/src/weights.rs
type WeightInfo (line 55) | pub trait WeightInfo {
method skip_external_validators (line 56) | fn skip_external_validators() -> Weight;
method add_whitelisted (line 57) | fn add_whitelisted(b: u32, ) -> Weight;
method remove_whitelisted (line 58) | fn remove_whitelisted(b: u32, ) -> Weight;
method force_era (line 59) | fn force_era() -> Weight;
method set_external_validators (line 60) | fn set_external_validators() -> Weight;
method new_session (line 61) | fn new_session(r: u32, ) -> Weight;
method skip_external_validators (line 69) | fn skip_external_validators() -> Weight {
method add_whitelisted (line 82) | fn add_whitelisted(b: u32, ) -> Weight {
method remove_whitelisted (line 97) | fn remove_whitelisted(b: u32, ) -> Weight {
method force_era (line 110) | fn force_era() -> Weight {
method set_external_validators (line 120) | fn set_external_validators() -> Weight {
method new_session (line 141) | fn new_session(r: u32, ) -> Weight {
method skip_external_validators (line 158) | fn skip_external_validators() -> Weight {
method add_whitelisted (line 171) | fn add_whitelisted(b: u32, ) -> Weight {
method remove_whitelisted (line 186) | fn remove_whitelisted(b: u32, ) -> Weight {
method force_era (line 199) | fn force_era() -> Weight {
method set_external_validators (line 209) | fn set_external_validators() -> Weight {
method new_session (line 230) | fn new_session(r: u32, ) -> Weight {
type SubstrateWeight (line 65) | pub struct SubstrateWeight<T>(PhantomData<T>);
FILE: operator/pallets/grandpa-benchmarking/src/benchmarking.rs
type GrandpaId (line 28) | type GrandpaId = sp_consensus_grandpa::AuthorityId;
type GrandpaEquivocationProof (line 29) | type GrandpaEquivocationProof<T> = sp_consensus_grandpa::EquivocationProof<
constant PREENCODED_EQUIVOCATION_PROOF (line 36) | const PREENCODED_EQUIVOCATION_PROOF: [u8; 249] = [
function grandpa_id_for_validator (line 52) | fn grandpa_id_for_validator(i: u32) -> GrandpaId {
function setup_equivocation (line 59) | fn setup_equivocation<T: Config>(
function note_stalled (line 149) | fn note_stalled() -> Result<(), BenchmarkError> {
function report_equivocation (line 182) | fn report_equivocation(v: Linear<0, 1000>, n: Linear<0, 1>) -> Result<()...
FILE: operator/pallets/grandpa-benchmarking/src/lib.rs
type Pallet (line 5) | pub struct Pallet<T: Config>(pallet_grandpa::Pallet<T>);
type Config (line 13) | pub trait Config:
method benchmark_session_keys (line 24) | fn benchmark_session_keys(grandpa: sp_consensus_grandpa::AuthorityId) ...
function test_generate_equivocation_blob (line 40) | fn test_generate_equivocation_blob() {
FILE: operator/pallets/inbound-queue-v2/fixtures/src/register_token.rs
function make_register_token_message (line 14) | pub fn make_register_token_message() -> InboundQueueFixture {
FILE: operator/pallets/inbound-queue-v2/src/benchmarking.rs
function submit (line 16) | fn submit() -> Result<(), BenchmarkError> {
FILE: operator/pallets/inbound-queue-v2/src/lib.rs
constant LOG_TARGET (line 59) | pub const LOG_TARGET: &str = "snowbridge-pallet-inbound-queue-v2";
type AccountIdOf (line 61) | pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
type Nonce (line 63) | pub type Nonce<T> = SparseBitmapImpl<crate::NonceBitmap<T>>;
type Pallet (line 73) | pub struct Pallet<T>(_);
type BenchmarkHelper (line 76) | pub trait BenchmarkHelper<T> {
method initialize_storage (line 77) | fn initialize_storage(beacon_header: BeaconHeader, block_roots_root: H...
type Config (line 81) | pub trait Config: frame_system::Config {
type Event (line 104) | pub enum Event<T: Config> {
type Error (line 117) | pub enum Error<T> {
function from (line 157) | fn from(e: SendError) -> Self {
function from (line 167) | fn from(e: ConvertMessageError) -> Self {
type NonceBitmap (line 179) | pub type NonceBitmap<T: Config> = StorageMap<_, Twox64Concat, u128, u128...
type OperatingMode (line 183) | pub type OperatingMode<T: Config> = StorageValue<_, BasicOperatingMode, ...
function submit (line 190) | pub fn submit(origin: OriginFor<T>, event: Box<EventProof>) -> DispatchR...
function set_operating_mode (line 208) | pub fn set_operating_mode(
function process_message (line 220) | pub fn process_message(relayer: T::AccountId, message: Message) -> Dispa...
FILE: operator/pallets/inbound-queue-v2/src/message_processors.rs
type RemarkMessageProcessor (line 12) | pub struct RemarkMessageProcessor<T>(pub PhantomData<T>);
function can_process_message (line 18) | fn can_process_message(_who: &AccountId, _message: &Message) -> bool {
function process_message (line 22) | fn process_message(_who: AccountId, _message: Message) -> Result<[u8; 32...
type XcmMessageProcessor (line 32) | pub struct XcmMessageProcessor<T, Sender, Executor, Converter, AccountTo...
function can_process_message (line 54) | fn can_process_message(_who: &AccountId, message: &Message) -> bool {
function process_message (line 59) | fn process_message(who: AccountId, message: Message) -> Result<[u8; 32],...
function process_xcm (line 77) | pub fn process_xcm(who: T::AccountId, message: Message) -> Result<XcmHas...
function send_xcm (line 103) | fn send_xcm(
FILE: operator/pallets/inbound-queue-v2/src/mock.rs
type Block (line 22) | type Block = frame_system::mocking::MockBlock<Test>;
constant ERROR_ADDRESS (line 34) | pub(crate) const ERROR_ADDRESS: [u8; 20] = hex!("00000000000000000000000...
type AccountId (line 36) | pub type AccountId = sp_runtime::AccountId32;
type Balance (line 37) | type Balance = u128;
type AccountId (line 41) | type AccountId = AccountId;
type Lookup (line 42) | type Lookup = IdentityLookup<Self::AccountId>;
type AccountData (line 43) | type AccountData = pallet_balances::AccountData<u128>;
type Block (line 44) | type Block = Block;
type Balance (line 53) | type Balance = Balance;
type ExistentialDeposit (line 54) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 55) | type AccountStore = System;
type MockVerifier (line 59) | pub struct MockVerifier;
method verify (line 62) | fn verify(log: &Log, _: &Proof) -> Result<(), VerificationError> {
constant GATEWAY_ADDRESS (line 70) | const GATEWAY_ADDRESS: [u8; 20] = hex!["b1185ede04202fe62d38f5db72f71e38...
method initialize_storage (line 75) | fn initialize_storage(_: BeaconHeader, _: H256) {}
type MockTokenIdConvert (line 78) | pub struct MockTokenIdConvert;
method convert (line 80) | fn convert(_id: &TokenId) -> Option<Location> {
method convert_back (line 83) | fn convert_back(_loc: &Location) -> Option<TokenId> {
type MockAccountLocationConverter (line 88) | pub struct MockAccountLocationConverter<AccountId>(PhantomData<AccountId>);
function try_convert (line 92) | fn try_convert(_who: &AccountId) -> Result<Location, &AccountId> {
type BridgeReward (line 122) | pub enum BridgeReward {
function register_reward (line 132) | fn register_reward(
type DummyPrefix (line 141) | pub struct DummyPrefix;
method can_process_message (line 144) | fn can_process_message(_who: &AccountId, _message: &Message) -> bool {
method process_message (line 148) | fn process_message(_who: AccountId, _message: Message) -> Result<[u8; ...
type DummySuffix (line 153) | pub struct DummySuffix;
method can_process_message (line 156) | fn can_process_message(_who: &AccountId, _message: &Message) -> bool {
method process_message (line 160) | fn process_message(_who: AccountId, _message: Message) -> Result<[u8; ...
type RuntimeEvent (line 166) | type RuntimeEvent = RuntimeEvent;
type Verifier (line 167) | type Verifier = MockVerifier;
type RewardPayment (line 168) | type RewardPayment = ();
type GatewayAddress (line 169) | type GatewayAddress = GatewayAddress;
type MessageProcessor (line 170) | type MessageProcessor = (
type Helper (line 192) | type Helper = Test;
type WeightInfo (line 193) | type WeightInfo = ();
type RewardKind (line 194) | type RewardKind = BridgeReward;
type DefaultRewardKind (line 195) | type DefaultRewardKind = SnowbridgeReward;
function setup (line 198) | pub fn setup() {
function new_tester (line 202) | pub fn new_tester() -> sp_io::TestExternalities {
function mock_event_log (line 215) | pub fn mock_event_log() -> Log {
function mock_event_log_invalid_gateway (line 227) | pub fn mock_event_log_invalid_gateway() -> Log {
function mock_event_log_invalid_message (line 239) | pub fn mock_event_log_invalid_message() -> Log {
function mock_execution_proof (line 251) | pub fn mock_execution_proof() -> ExecutionProof {
function mock_event_log_v2 (line 282) | pub fn mock_event_log_v2() -> Log {
FILE: operator/pallets/inbound-queue-v2/src/test.rs
function test_submit_happy_path (line 14) | fn test_submit_happy_path() {
function test_submit_with_invalid_gateway (line 53) | fn test_submit_with_invalid_gateway() {
function test_submit_verification_fails_with_invalid_proof (line 74) | fn test_submit_verification_fails_with_invalid_proof() {
function test_submit_fails_with_malformed_message (line 99) | fn test_submit_fails_with_malformed_message() {
function test_using_same_nonce_fails (line 122) | fn test_using_same_nonce_fails() {
function test_set_operating_mode (line 160) | fn test_set_operating_mode() {
function test_set_operating_mode_root_only (line 185) | fn test_set_operating_mode_root_only() {
function test_xcm_send_failure (line 198) | fn test_xcm_send_failure() {
function test_xcm_send_validate_failure (line 234) | fn test_xcm_send_validate_failure() {
function test_xcm_charge_fees_failure (line 264) | fn test_xcm_charge_fees_failure() {
function test_register_token (line 289) | fn test_register_token() {
function test_switch_operating_mode (line 306) | fn test_switch_operating_mode() {
function zero_reward_does_not_register_reward (line 338) | fn zero_reward_does_not_register_reward() {
FILE: operator/pallets/inbound-queue-v2/src/weights.rs
type WeightInfo (line 19) | pub trait WeightInfo {
method submit (line 20) | fn submit() -> Weight;
method submit (line 25) | fn submit() -> Weight {
FILE: operator/pallets/outbound-commitment-store/src/lib.rs
constant STORAGE_VERSION (line 25) | const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
type Pallet (line 37) | pub struct Pallet<T>(_);
type Config (line 40) | pub trait Config: frame_system::Config {
type LatestCommitment (line 46) | pub type LatestCommitment<T> = StorageValue<_, H256, OptionQuery>;
type Event (line 50) | pub enum Event<T: Config> {
function store_commitment (line 56) | pub fn store_commitment(commitment: H256) {
function get_latest_commitment (line 62) | pub fn get_latest_commitment() -> Option<H256> {
FILE: operator/pallets/outbound-queue-v2/src/api.rs
function prove_message (line 9) | pub fn prove_message<T>(leaf_index: u64) -> Option<MerkleProof>
FILE: operator/pallets/outbound-queue-v2/src/benchmarking.rs
function build_message (line 26) | fn build_message<T: Config>() -> (Message, OutboundMessage) {
function initialize_worst_case (line 61) | fn initialize_worst_case<T: Config>() {
function initialize_with_one_message (line 68) | fn initialize_with_one_message<T: Config>() {
function do_process_message (line 77) | fn do_process_message() -> Result<(), BenchmarkError> {
function commit (line 94) | fn commit() -> Result<(), BenchmarkError> {
function commit_single (line 109) | fn commit_single() -> Result<(), BenchmarkError> {
function on_initialize (line 122) | fn on_initialize() -> Result<(), BenchmarkError> {
function process (line 135) | fn process() -> Result<(), BenchmarkError> {
function submit_delivery_receipt (line 154) | fn submit_delivery_receipt() -> Result<(), BenchmarkError> {
FILE: operator/pallets/outbound-queue-v2/src/fixture.rs
function make_submit_delivery_receipt_message (line 14) | pub fn make_submit_delivery_receipt_message() -> EventFixture {
FILE: operator/pallets/outbound-queue-v2/src/lib.rs
type DeliveryReceiptOf (line 100) | type DeliveryReceiptOf<T> = DeliveryReceipt<<T as frame_system::Config>:...
type Pallet (line 114) | pub struct Pallet<T>(_);
type Config (line 117) | pub trait Config: frame_system::Config {
type Event (line 168) | pub enum Event<T: Config> {
type Error (line 196) | pub enum Error<T> {
type Messages (line 224) | pub(super) type Messages<T: Config> = StorageValue<_, Vec<OutboundMessag...
type MessageLeaves (line 232) | pub(super) type MessageLeaves<T: Config> = StorageValue<_, Vec<H256>, Va...
type Nonce (line 236) | pub type Nonce<T: Config> = StorageValue<_, u64, ValueQuery>;
type PendingOrders (line 240) | pub type PendingOrders<T: Config> =
function on_initialize (line 245) | fn on_initialize(_: BlockNumberFor<T>) -> Weight {
function on_finalize (line 253) | fn on_finalize(_: BlockNumberFor<T>) {
type BenchmarkHelper (line 259) | pub trait BenchmarkHelper<T> {
method initialize_storage (line 260) | fn initialize_storage(beacon_header: BeaconHeader, block_roots_root: H...
function submit_delivery_receipt (line 270) | pub fn submit_delivery_receipt(
function commit (line 289) | pub(crate) fn commit() {
function do_process_message (line 309) | pub(crate) fn do_process_message(
function process_delivery_receipt (line 391) | pub fn process_delivery_receipt(
function calculate_local_fee (line 421) | pub(crate) fn calculate_local_fee() -> T::Balance {
FILE: operator/pallets/outbound-queue-v2/src/mock.rs
type Block (line 30) | type Block = frame_system::mocking::MockBlock<Test>;
type AccountId (line 31) | type AccountId = AccountId32;
type BaseCallFilter (line 44) | type BaseCallFilter = Everything;
type RuntimeOrigin (line 45) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 46) | type RuntimeCall = RuntimeCall;
type RuntimeTask (line 47) | type RuntimeTask = RuntimeTask;
type Hash (line 48) | type Hash = H256;
type Hashing (line 49) | type Hashing = BlakeTwo256;
type AccountId (line 50) | type AccountId = AccountId;
type Lookup (line 51) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 52) | type RuntimeEvent = RuntimeEvent;
type PalletInfo (line 53) | type PalletInfo = PalletInfo;
type Nonce (line 54) | type Nonce = u64;
type Block (line 55) | type Block = Block;
type RuntimeEvent (line 65) | type RuntimeEvent = RuntimeEvent;
type WeightInfo (line 66) | type WeightInfo = ();
type MessageProcessor (line 67) | type MessageProcessor = OutboundQueue;
type Size (line 68) | type Size = u32;
type QueueChangeHandler (line 69) | type QueueChangeHandler = ();
type HeapSize (line 70) | type HeapSize = HeapSize;
type MaxStale (line 71) | type MaxStale = MaxStale;
type ServiceWeight (line 72) | type ServiceWeight = ServiceWeight;
type IdleMaxServiceWeight (line 73) | type IdleMaxServiceWeight = ();
type QueuePausedQuery (line 74) | type QueuePausedQuery = ();
type MockVerifier (line 78) | pub struct MockVerifier;
method verify (line 81) | fn verify(_: &Log, _: &Proof) -> Result<(), VerificationError> {
constant GATEWAY_ADDRESS (line 86) | const GATEWAY_ADDRESS: [u8; 20] = hex!["eda338e4dc46038493b885327842fd3e...
constant WETH (line 87) | const WETH: [u8; 20] = hex!["C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"];
constant DOT (line 102) | pub const DOT: u128 = 10_000_000_000;
type BridgeReward (line 117) | pub enum BridgeReward {
function register_reward (line 123) | fn register_reward(
type RuntimeEvent (line 132) | type RuntimeEvent = RuntimeEvent;
type Verifier (line 133) | type Verifier = MockVerifier;
type GatewayAddress (line 134) | type GatewayAddress = GatewayAddress;
type Hashing (line 135) | type Hashing = Keccak256;
type MessageQueue (line 136) | type MessageQueue = MessageQueue;
type MaxMessagePayloadSize (line 137) | type MaxMessagePayloadSize = ConstU32<1024>;
type MaxMessagesPerBlock (line 138) | type MaxMessagesPerBlock = ConstU32<20>;
type GasMeter (line 139) | type GasMeter = ConstantGasMeter;
type Balance (line 140) | type Balance = u128;
type WeightToFee (line 141) | type WeightToFee = IdentityFee<u128>;
type WeightInfo (line 142) | type WeightInfo = ();
type RewardPayment (line 143) | type RewardPayment = ();
type ConvertAssetId (line 144) | type ConvertAssetId = ();
type EthereumNetwork (line 145) | type EthereumNetwork = EthereumNetwork;
type RewardKind (line 146) | type RewardKind = BridgeReward;
type DefaultRewardKind (line 147) | type DefaultRewardKind = DefaultMyRewardKind;
type OnNewCommitment (line 148) | type OnNewCommitment = ();
function setup (line 151) | fn setup() {
function new_tester (line 155) | pub fn new_tester() -> sp_io::TestExternalities {
function run_to_end_of_next_block (line 164) | pub fn run_to_end_of_next_block() {
function bridge_hub_root_origin (line 180) | pub fn bridge_hub_root_origin() -> AgentId {
function mock_governance_message (line 184) | pub fn mock_governance_message<T>() -> Message
function mock_invalid_governance_message (line 207) | pub fn mock_invalid_governance_message<T>() -> Message
function mock_message (line 229) | pub fn mock_message(sibling_para_id: u32) -> Message {
function mock_register_token_message (line 243) | pub fn mock_register_token_message(sibling_para_id: u32) -> Message {
FILE: operator/pallets/outbound-queue-v2/src/process_message_impl.rs
type Origin (line 12) | type Origin = AggregateMessageOrigin;
method process_message (line 13) | fn process_message(
FILE: operator/pallets/outbound-queue-v2/src/send_message_impl.rs
type Ticket (line 22) | type Ticket = Message;
method validate (line 24) | fn validate(message: &Message) -> Result<Self::Ticket, SendError> {
method deliver (line 35) | fn deliver(ticket: Self::Ticket) -> Result<H256, SendError> {
type Balance (line 50) | type Balance = T::Balance;
method local_fee (line 53) | fn local_fee() -> Self::Balance {
FILE: operator/pallets/outbound-queue-v2/src/test.rs
function submit_messages_and_commit (line 23) | fn submit_messages_and_commit() {
function submit_message_fail_too_large (line 44) | fn submit_message_fail_too_large() {
function commit_exits_early_if_no_processed_messages (line 55) | fn commit_exits_early_if_no_processed_messages() {
function process_message_yields_on_max_messages_per_block (line 67) | fn process_message_yields_on_max_messages_per_block() {
function process_message_fails_on_max_nonce_reached (line 105) | fn process_message_fails_on_max_nonce_reached() {
function process_message_fails_on_overweight_message (line 127) | fn process_message_fails_on_overweight_message() {
function governance_message_not_processed_in_same_block_when_queue_congested_with_low_priority_messages (line 147) | fn governance_message_not_processed_in_same_block_when_queue_congested_w...
function encode_digest_item_with_correct_index (line 208) | fn encode_digest_item_with_correct_index() {
function encode_digest_item (line 220) | fn encode_digest_item() {
function encode_mock_message (line 236) | fn encode_mock_message(message: Message) -> Vec<u8> {
function encode_unlock_message (line 259) | fn encode_unlock_message() {
function encode_register_pna (line 267) | fn encode_register_pna() {
FILE: operator/pallets/outbound-queue-v2/src/types.rs
type ProcessMessageOriginOf (line 12) | pub type ProcessMessageOriginOf<T> = <Pallet<T> as ProcessMessage>::Origin;
type PendingOrder (line 16) | pub struct PendingOrder<BlockNumber> {
type OnNewCommitment (line 27) | pub trait OnNewCommitment {
method on_new_commitment (line 28) | fn on_new_commitment(commitment: H256);
method on_new_commitment (line 32) | fn on_new_commitment(_commitment: H256) {}
FILE: operator/pallets/outbound-queue-v2/src/weights.rs
type WeightInfo (line 33) | pub trait WeightInfo {
method do_process_message (line 34) | fn do_process_message() -> Weight;
method commit (line 35) | fn commit() -> Weight;
method commit_single (line 36) | fn commit_single() -> Weight;
method submit_delivery_receipt (line 37) | fn submit_delivery_receipt() -> Weight;
method on_initialize (line 38) | fn on_initialize() -> Weight;
method process (line 39) | fn process() -> Weight;
method do_process_message (line 52) | fn do_process_message() -> Weight {
method commit (line 65) | fn commit() -> Weight {
method commit_single (line 75) | fn commit_single() -> Weight {
method submit_delivery_receipt (line 85) | fn submit_delivery_receipt() -> Weight {
method on_initialize (line 92) | fn on_initialize() -> Weight {
method process (line 98) | fn process() -> Weight {
FILE: operator/pallets/proxy-genesis-companion/src/lib.rs
type Pallet (line 42) | pub struct Pallet<T>(PhantomData<T>);
type Config (line 46) | pub trait Config:
type GenesisConfig (line 54) | pub struct GenesisConfig<T: Config> {
method default (line 64) | fn default() -> Self {
method build (line 73) | fn build(&self) {
FILE: operator/pallets/proxy-genesis-companion/src/mock.rs
type AccountId (line 27) | pub type AccountId = u64;
type Balance (line 28) | pub type Balance = u128;
type Block (line 30) | type Block = frame_system::mocking::MockBlock<Test>;
type Block (line 45) | type Block = Block;
type AccountData (line 46) | type AccountData = pallet_balances::AccountData<Balance>;
type Balance (line 55) | type Balance = Balance;
type ExistentialDeposit (line 56) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 57) | type AccountStore = System;
type ProxyType (line 86) | pub struct ProxyType;
method filter (line 89) | fn filter(&self, _c: &RuntimeCall) -> bool {
method is_superset (line 93) | fn is_superset(&self, _o: &Self) -> bool {
type RuntimeEvent (line 99) | type RuntimeEvent = RuntimeEvent;
type RuntimeCall (line 100) | type RuntimeCall = RuntimeCall;
type Currency (line 101) | type Currency = Balances;
type ProxyType (line 102) | type ProxyType = ProxyType;
type ProxyDepositBase (line 103) | type ProxyDepositBase = ProxyDepositBase;
type ProxyDepositFactor (line 104) | type ProxyDepositFactor = ProxyDepositFactor;
type MaxProxies (line 105) | type MaxProxies = ConstU32<32>;
type WeightInfo (line 106) | type WeightInfo = ();
type MaxPending (line 107) | type MaxPending = ConstU32<32>;
type CallHasher (line 108) | type CallHasher = BlakeTwo256;
type AnnouncementDepositBase (line 109) | type AnnouncementDepositBase = AnnouncementDepositBase;
type AnnouncementDepositFactor (line 110) | type AnnouncementDepositFactor = AnnouncementDepositFactor;
type ProxyType (line 114) | type ProxyType = ProxyType;
type ExtBuilder (line 118) | pub(crate) struct ExtBuilder {
method with_balances (line 133) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method with_proxies (line 138) | pub(crate) fn with_proxies(mut self, proxies: Vec<(AccountId, AccountI...
method build (line 143) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 124) | fn default() -> ExtBuilder {
FILE: operator/pallets/proxy-genesis-companion/src/tests.rs
function empty_genesis_works (line 22) | fn empty_genesis_works() {
function non_empty_genesis_works (line 29) | fn non_empty_genesis_works() {
function genesis_fails_if_balance_insufficient (line 58) | fn genesis_fails_if_balance_insufficient() {
FILE: operator/pallets/session-benchmarking/src/lib.rs
type Pallet (line 5) | pub struct Pallet<T: Config>(pallet_session::Pallet<T>);
type Config (line 8) | pub trait Config: pallet_session::Config {}
FILE: operator/pallets/system-v2/src/api.rs
function agent_id (line 9) | pub fn agent_id<Runtime>(location: VersionedLocation) -> Option<H256>
FILE: operator/pallets/system-v2/src/benchmarking.rs
function register_token (line 20) | fn register_token() -> Result<(), BenchmarkError> {
function upgrade (line 39) | fn upgrade() -> Result<(), BenchmarkError> {
function set_operating_mode (line 61) | fn set_operating_mode() -> Result<(), BenchmarkError> {
FILE: operator/pallets/system-v2/src/lib.rs
type AccountIdOf (line 52) | pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
type BenchmarkHelper (line 54) | pub trait BenchmarkHelper<O>
method make_xcm_origin (line 58) | fn make_xcm_origin(location: Location) -> O;
type Pallet (line 66) | pub struct Pallet<T>(_);
type Config (line 69) | pub trait Config: frame_system::Config + snowbridge_pallet_system::Config {
type Event (line 88) | pub enum Event<T: Config> {
type Error (line 107) | pub enum Error<T> {
function upgrade (line 134) | pub fn upgrade(
function set_operating_mode (line 172) | pub fn set_operating_mode(origin: OriginFor<T>, mode: OperatingMode) -> ...
function register_token (line 193) | pub fn register_token(
function send (line 238) | fn send(origin: H256, command: Command, fee: u128) -> DispatchResult {
function reanchor (line 257) | pub fn reanchor(location: Location) -> Result<Location, Error<T>> {
function location_to_message_origin (line 263) | pub fn location_to_message_origin(location: Location) -> Result<H256, Er...
function convert (line 271) | fn convert(foreign_id: &TokenId) -> Option<Location> {
function convert_back (line 274) | fn convert_back(location: &Location) -> Option<TokenId> {
FILE: operator/pallets/system-v2/src/mock.rs
type Block (line 26) | type Block = frame_system::mocking::MockBlock<Test>;
type Balance (line 27) | type Balance = u128;
type AccountId (line 29) | pub type AccountId = AccountId32;
type BaseCallFilter (line 45) | type BaseCallFilter = frame_support::traits::Everything;
type RuntimeOrigin (line 46) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 47) | type RuntimeCall = RuntimeCall;
type RuntimeTask (line 48) | type RuntimeTask = RuntimeTask;
type Hash (line 49) | type Hash = H256;
type Hashing (line 50) | type Hashing = BlakeTwo256;
type AccountId (line 51) | type AccountId = AccountId;
type Lookup (line 52) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 53) | type RuntimeEvent = RuntimeEvent;
type PalletInfo (line 54) | type PalletInfo = PalletInfo;
type AccountData (line 55) | type AccountData = pallet_balances::AccountData<u128>;
type Nonce (line 56) | type Nonce = u64;
type Block (line 57) | type Block = Block;
type Balance (line 62) | type Balance = Balance;
type ExistentialDeposit (line 63) | type ExistentialDeposit = ConstU128<1>;
type AccountStore (line 64) | type AccountStore = System;
type RuntimeOrigin (line 68) | type RuntimeOrigin = RuntimeOrigin;
function make_xcm_origin (line 92) | fn make_xcm_origin(location: Location) -> RuntimeOrigin {
type AllowFromAssetHub (line 97) | pub struct AllowFromAssetHub;
method contains (line 99) | fn contains(location: &Location) -> bool {
type RuntimeEvent (line 105) | type RuntimeEvent = RuntimeEvent;
type OutboundQueue (line 106) | type OutboundQueue = MockOkOutboundQueue;
type FrontendOrigin (line 107) | type FrontendOrigin = pallet_xcm_origin::EnsureXcm<AllowFromAssetHub>;
type GovernanceOrigin (line 108) | type GovernanceOrigin = EnsureRootWithSuccess<AccountId, RootLocation>;
type WeightInfo (line 109) | type WeightInfo = ();
type Helper (line 111) | type Helper = ();
function make_xcm_origin (line 127) | fn make_xcm_origin(location: Location) -> RuntimeOrigin {
type RuntimeEvent (line 133) | type RuntimeEvent = RuntimeEvent;
type OutboundQueue (line 134) | type OutboundQueue = MockOkOutboundQueueV1;
type SiblingOrigin (line 135) | type SiblingOrigin = pallet_xcm_origin::EnsureXcm<AllowSiblingsOnly>;
type AgentIdOf (line 136) | type AgentIdOf = snowbridge_core::AgentIdOf;
type Token (line 137) | type Token = Balances;
type TreasuryAccount (line 138) | type TreasuryAccount = TreasuryAccount;
type DefaultPricingParameters (line 139) | type DefaultPricingParameters = Parameters;
type InboundDeliveryCost (line 140) | type InboundDeliveryCost = InboundDeliveryCost;
type WeightInfo (line 141) | type WeightInfo = ();
type UniversalLocation (line 142) | type UniversalLocation = UniversalLocation;
type EthereumLocation (line 143) | type EthereumLocation = EthereumDestination;
type Helper (line 145) | type Helper = ();
function new_test_ext (line 149) | pub fn new_test_ext(_genesis_build: bool) -> sp_io::TestExternalities {
function make_xcm_origin (line 168) | pub fn make_xcm_origin(location: Location) -> RuntimeOrigin {
FILE: operator/pallets/system-v2/src/tests.rs
function register_tokens_succeeds (line 9) | fn register_tokens_succeeds() {
function agent_id_from_location (line 24) | fn agent_id_from_location() {
function upgrade_as_root (line 46) | fn upgrade_as_root() {
function upgrade_as_signed_fails (line 72) | fn upgrade_as_signed_fails() {
function upgrade_with_params (line 89) | fn upgrade_with_params() {
function set_operating_mode (line 108) | fn set_operating_mode() {
type RegisterTokenTestCase (line 121) | pub struct RegisterTokenTestCase {
function register_all_tokens_succeeds (line 127) | fn register_all_tokens_succeeds() {
function register_ethereum_native_token_fails (line 186) | fn register_ethereum_native_token_fails() {
FILE: operator/pallets/system-v2/src/weights.rs
type WeightInfo (line 34) | pub trait WeightInfo {
method register_token (line 35) | fn register_token() -> Weight;
method upgrade (line 36) | fn upgrade() -> Weight;
method set_operating_mode (line 37) | fn set_operating_mode() -> Weight;
method register_token (line 42) | fn register_token() -> Weight {
method upgrade (line 61) | fn upgrade() -> Weight {
method set_operating_mode (line 80) | fn set_operating_mode() -> Weight {
FILE: operator/pallets/system/src/api.rs
function agent_id (line 10) | pub fn agent_id<Runtime>(location: VersionedLocation) -> Option<AgentId>
FILE: operator/pallets/system/src/benchmarking.rs
function upgrade (line 20) | fn upgrade() -> Result<(), BenchmarkError> {
function set_operating_mode (line 42) | fn set_operating_mode() -> Result<(), BenchmarkError> {
function set_pricing_parameters (line 50) | fn set_pricing_parameters() -> Result<(), BenchmarkError> {
function set_token_transfer_fees (line 60) | fn set_token_transfer_fees() -> Result<(), BenchmarkError> {
function register_token (line 68) | fn register_token() -> Result<(), BenchmarkError> {
FILE: operator/pallets/system/src/lib.rs
type BalanceOf (line 65) | pub type BalanceOf<T> =
type AccountIdOf (line 67) | pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
type PricingParametersOf (line 68) | pub type PricingParametersOf<T> = PricingParametersRecord<BalanceOf<T>>;
function agent_id_of (line 71) | pub fn agent_id_of<T: Config>(location: &Location) -> Result<H256, Dispa...
type BenchmarkHelper (line 76) | pub trait BenchmarkHelper<O>
method make_xcm_origin (line 80) | fn make_xcm_origin(location: Location) -> O;
type PaysFee (line 85) | pub enum PaysFee<T>
type Pallet (line 107) | pub struct Pallet<T>(_);
type Config (line 110) | pub trait Config: frame_system::Config {
type Event (line 150) | pub enum Event<T: Config> {
type Error (line 201) | pub enum Error<T> {
type Agents (line 218) | pub type Agents<T: Config> = StorageMap<_, Twox64Concat, AgentId, (), Op...
type Channels (line 223) | pub type Channels<T: Config> = StorageMap<_, Twox64Concat, ChannelId, Ch...
type PricingParameters (line 227) | pub type PricingParameters<T: Config> =
type ForeignToNativeId (line 232) | pub type ForeignToNativeId<T: Config> =
type NativeToForeignId (line 237) | pub type NativeToForeignId<T: Config> =
type GenesisConfig (line 242) | pub struct GenesisConfig<T: Config> {
method build (line 253) | fn build(&self) {
function upgrade (line 271) | pub fn upgrade(
function set_operating_mode (line 309) | pub fn set_operating_mode(origin: OriginFor<T>, mode: OperatingMode) -> ...
function set_pricing_parameters (line 326) | pub fn set_pricing_parameters(
function set_token_transfer_fees (line 362) | pub fn set_token_transfer_fees(
function register_token (line 402) | pub fn register_token(
function send (line 424) | fn send(channel_id: ChannelId, command: Command, pays_fee: PaysFee<T>) -...
function initialize (line 453) | pub fn initialize(para_id: ParaId, asset_hub_para_id: ParaId) -> Result<...
function is_initialized (line 495) | pub(crate) fn is_initialized() -> bool {
function do_register_token (line 501) | pub(crate) fn do_register_token(
type Source (line 539) | type Source = ChannelId;
type Target (line 540) | type Target = Channel;
method lookup (line 541) | fn lookup(channel_id: Self::Source) -> Option<Self::Target> {
function contains (line 547) | fn contains(channel_id: &ChannelId) -> bool {
function get (line 553) | fn get() -> PricingParametersOf<T> {
function convert (line 559) | fn convert(foreign_id: &TokenId) -> Option<Location> {
function convert_back (line 562) | fn convert_back(location: &Location) -> Option<TokenId> {
FILE: operator/pallets/system/src/migration.rs
constant LOG_TARGET (line 17) | const LOG_TARGET: &str = "ethereum_system::migration";
constant STORAGE_VERSION (line 20) | pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
type InitializeOnUpgrade (line 25) | pub struct InitializeOnUpgrade<T, BridgeHubParaId, AssetHubParaId>(
method on_runtime_upgrade (line 36) | fn on_runtime_upgrade() -> Weight {
method pre_upgrade (line 58) | fn pre_upgrade() -> Result<Vec<u8>, TryRuntimeError> {
method post_upgrade (line 74) | fn post_upgrade(_: Vec<u8>) -> Result<(), TryRuntimeError> {
type FeePerGasMigration (line 91) | pub struct FeePerGasMigration<T>(PhantomData<T>);
function calculate_remote_fee_v1 (line 99) | fn calculate_remote_fee_v1(params: &PricingParametersOf<T>) -> U256 {
function calculate_remote_fee_v2 (line 119) | fn calculate_remote_fee_v2(params: &PricingParametersOf<T>) -> U256 {
constant GAS_INCREASE_PERCENTAGE (line 135) | const GAS_INCREASE_PERCENTAGE: u64 = 70;
method on_runtime_upgrade (line 141) | fn on_runtime_upgrade() -> Weight {
method pre_upgrade (line 161) | fn pre_upgrade() -> Result<Vec<u8>, TryRuntimeError> {
method post_upgrade (line 176) | fn post_upgrade(state: Vec<u8>) -> Result<(), TryRuntimeError> {
type FeePerGasMigrationV0ToV1 (line 221) | pub type FeePerGasMigrationV0ToV1<T> = VersionedMigration<
FILE: operator/pallets/system/src/mock.rs
type Block (line 27) | type Block = frame_system::mocking::MockBlock<Test>;
type Balance (line 28) | type Balance = u128;
type AccountId (line 30) | pub type AccountId = AccountId32;
type Pallet (line 43) | pub struct Pallet<T>(_);
type Config (line 46) | pub trait Config: frame_system::Config {
type Origin (line 53) | pub struct Origin(pub Location);
method from (line 56) | fn from(location: Location) -> Origin {
type EnsureXcm (line 63) | pub struct EnsureXcm<F>(PhantomData<F>);
type Success (line 68) | type Success = Location;
function try_origin (line 70) | fn try_origin(outer: O) -> Result<Self::Success, O> {
function try_successful_origin (line 80) | fn try_successful_origin() -> Result<O, ()> {
type BaseCallFilter (line 101) | type BaseCallFilter = frame_support::traits::Everything;
type RuntimeOrigin (line 102) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall (line 103) | type RuntimeCall = RuntimeCall;
type RuntimeTask (line 104) | type RuntimeTask = RuntimeTask;
type Hash (line 105) | type Hash = H256;
type Hashing (line 106) | type Hashing = BlakeTwo256;
type AccountId (line 107) | type AccountId = AccountId;
type Lookup (line 108) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 109) | type RuntimeEvent = RuntimeEvent;
type PalletInfo (line 110) | type PalletInfo = PalletInfo;
type AccountData (line 111) | type AccountData = pallet_balances::AccountData<u128>;
type Nonce (line 112) | type Nonce = u64;
type Block (line 113) | type Block = Block;
type Balance (line 118) | type Balance = Balance;
type ExistentialDeposit (line 119) | type ExistentialDeposit = ConstU128<1>;
type AccountStore (line 120) | type AccountStore = System;
type RuntimeOrigin (line 124) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeEvent (line 134) | type RuntimeEvent = RuntimeEvent;
type WeightInfo (line 135) | type WeightInfo = ();
type MessageProcessor (line 136) | type MessageProcessor = OutboundQueue;
type Size (line 137) | type Size = u32;
type QueueChangeHandler (line 138) | type QueueChangeHandler = ();
type HeapSize (line 139) | type HeapSize = HeapSize;
type MaxStale (line 140) | type MaxStale = MaxStale;
type ServiceWeight (line 141) | type ServiceWeight = ServiceWeight;
type IdleMaxServiceWeight (line 142) | type IdleMaxServiceWeight = ();
type QueuePausedQuery (line 143) | type QueuePausedQuery = ();
type RuntimeEvent (line 153) | type RuntimeEvent = RuntimeEvent;
type Hashing (line 154) | type Hashing = Keccak256;
type MessageQueue (line 155) | type MessageQueue = MessageQueue;
type Decimals (line 156) | type Decimals = ConstU8<10>;
type MaxMessagePayloadSize (line 157) | type MaxMessagePayloadSize = MaxMessagePayloadSize;
type MaxMessagesPerBlock (line 158) | type MaxMessagesPerBlock = MaxMessagesPerBlock;
type GasMeter (line 159) | type GasMeter = ConstantGasMeter;
type Balance (line 160) | type Balance = u128;
type PricingParameters (line 161) | type PricingParameters = EthereumSystem;
type Channels (line 162) | type Channels = EthereumSystem;
type WeightToFee (line 163) | type WeightToFee = IdentityFee<u128>;
type WeightInfo (line 164) | type WeightInfo = ();
constant DOT (line 178) | pub const DOT: u128 = 10_000_000_000;
function make_xcm_origin (line 198) | fn make_xcm_origin(location: Location) -> RuntimeOrigin {
type RuntimeEvent (line 204) | type RuntimeEvent = RuntimeEvent;
type OutboundQueue (line 205) | type OutboundQueue = OutboundQueue;
type SiblingOrigin (line 206) | type SiblingOrigin = pallet_xcm_origin::EnsureXcm<AllowSiblingsOnly>;
type AgentIdOf (line 207) | type AgentIdOf = snowbridge_core::AgentIdOf;
type TreasuryAccount (line 208) | type TreasuryAccount = TreasuryAccount;
type Token (line 209) | type Token = Balances;
type DefaultPricingParameters (line 210) | type DefaultPricingParameters = Parameters;
type WeightInfo (line 211) | type WeightInfo = ();
type InboundDeliveryCost (line 212) | type InboundDeliveryCost = InboundDeliveryCost;
type UniversalLocation (line 213) | type UniversalLocation = UniversalLocation;
type EthereumLocation (line 214) | type EthereumLocation = EthereumDestination;
type Helper (line 216) | type Helper = ();
function new_test_ext (line 220) | pub fn new_test_ext(genesis_build: bool) -> sp_io::TestExternalities {
function make_agent_id (line 251) | pub fn make_agent_id(location: Location) -> AgentId {
FILE: operator/pallets/system/src/tests.rs
function test_agent_for_here (line 11) | fn test_agent_for_here() {
function upgrade_as_root (line 23) | fn upgrade_as_root() {
function upgrade_as_signed_fails (line 40) | fn upgrade_as_signed_fails() {
function upgrade_with_params (line 54) | fn upgrade_with_params() {
function set_operating_mode (line 73) | fn set_operating_mode() {
function set_operating_mode_as_signed_fails (line 87) | fn set_operating_mode_as_signed_fails() {
function set_pricing_parameters (line 97) | fn set_pricing_parameters() {
function set_pricing_parameters_as_signed_fails (line 110) | fn set_pricing_parameters_as_signed_fails() {
function set_pricing_parameters_invalid (line 123) | fn set_pricing_parameters_invalid() {
function set_token_transfer_fees (line 162) | fn set_token_transfer_fees() {
function set_token_transfer_fees_root_only (line 176) | fn set_token_transfer_fees_root_only() {
function set_token_transfer_fees_invalid (line 188) | fn set_token_transfer_fees_invalid() {
function genesis_build_initializes_correctly (line 200) | fn genesis_build_initializes_correctly() {
function no_genesis_build_is_uninitialized (line 207) | fn no_genesis_build_is_uninitialized() {
function register_token_with_signed_yields_bad_origin (line 214) | fn register_token_with_signed_yields_bad_origin() {
type RegisterTokenTestCase (line 226) | pub struct RegisterTokenTestCase {
function register_all_tokens_succeeds (line 236) | fn register_all_tokens_succeeds() {
function register_ethereum_native_token_fails (line 311) | fn register_ethereum_native_token_fails() {
FILE: operator/pallets/system/src/weights.rs
type WeightInfo (line 34) | pub trait WeightInfo {
method upgrade (line 35) | fn upgrade() -> Weight;
method set_operating_mode (line 36) | fn set_operating_mode() -> Weight;
method set_token_transfer_fees (line 37) | fn set_token_transfer_fees() -> Weight;
method set_pricing_parameters (line 38) | fn set_pricing_parameters() -> Weight;
method register_token (line 39) | fn register_token() -> Weight;
method upgrade (line 54) | fn upgrade() -> Weight {
method set_operating_mode (line 73) | fn set_operating_mode() -> Weight {
method set_token_transfer_fees (line 92) | fn set_token_transfer_fees() -> Weight {
method set_pricing_parameters (line 112) | fn set_pricing_parameters() -> Weight {
method register_token (line 122) | fn register_token() -> Weight {
FILE: operator/precompiles/batch/src/lib.rs
type Mode (line 34) | pub enum Mode {
constant LOG_SUBCALL_SUCCEEDED (line 40) | pub const LOG_SUBCALL_SUCCEEDED: [u8; 32] = keccak256!("SubcallSucceeded...
constant LOG_SUBCALL_FAILED (line 41) | pub const LOG_SUBCALL_FAILED: [u8; 32] = keccak256!("SubcallFailed(uint2...
constant CALL_DATA_LIMIT (line 42) | pub const CALL_DATA_LIMIT: u32 = 2u32.pow(16);
constant ARRAY_LIMIT (line 43) | pub const ARRAY_LIMIT: u32 = 2u32.pow(9);
type GetCallDataLimit (line 45) | type GetCallDataLimit = ConstU32<CALL_DATA_LIMIT>;
type GetArrayLimit (line 46) | type GetArrayLimit = ConstU32<ARRAY_LIMIT>;
function log_subcall_succeeded (line 48) | pub fn log_subcall_succeeded(address: impl Into<H160>, index: usize) -> ...
function log_subcall_failed (line 56) | pub fn log_subcall_failed(address: impl Into<H160>, index: usize) -> Log {
type BatchPrecompile (line 66) | pub struct BatchPrecompile<Runtime>(PhantomData<Runtime>);
function batch_some (line 76) | fn batch_some(
function batch_some_until_failure (line 87) | fn batch_some_until_failure(
function batch_all (line 105) | fn batch_all(
function inner_batch (line 115) | fn inner_batch(
function batch_from_mode (line 294) | pub fn batch_from_mode(
FILE: operator/precompiles/batch/src/mock.rs
type AccountId (line 31) | pub type AccountId = MockAccount;
type Balance (line 32) | pub type Balance = u128;
type Block (line 34) | type Block = frame_system::mocking::MockBlockU32<Runtime>;
type BaseCallFilter (line 54) | type BaseCallFilter = Everything;
type DbWeight (line 55) | type DbWeight = ();
type RuntimeOrigin (line 56) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeTask (line 57) | type RuntimeTask = RuntimeTask;
type Nonce (line 58) | type Nonce = u64;
type Block (line 59) | type Block = Block;
type RuntimeCall (line 60) | type RuntimeCall = RuntimeCall;
type Hash (line 61) | type Hash = H256;
type Hashing (line 62) | type Hashing = BlakeTwo256;
type AccountId (line 63) | type AccountId = AccountId;
type Lookup (line 64) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 65) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 66) | type BlockHashCount = BlockHashCount;
type Version (line 67) | type Version = ();
type PalletInfo (line 68) | type PalletInfo = PalletInfo;
type AccountData (line 69) | type AccountData = pallet_balances::AccountData<Balance>;
type OnNewAccount (line 70) | type OnNewAccount = ();
type OnKilledAccount (line 71) | type OnKilledAccount = ();
type SystemWeightInfo (line 72) | type SystemWeightInfo = ();
type BlockWeights (line 73) | type BlockWeights = ();
type BlockLength (line 74) | type BlockLength = ();
type SS58Prefix (line 75) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 76) | type OnSetCode = ();
type MaxConsumers (line 77) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type SingleBlockMigrations (line 78) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 79) | type MultiBlockMigrator = ();
type PreInherents (line 80) | type PreInherents = ();
type PostInherents (line 81) | type PostInherents = ();
type PostTransactions (line 82) | type PostTransactions = ();
type ExtensionsWeightInfo (line 83) | type ExtensionsWeightInfo = ();
type MaxReserves (line 89) | type MaxReserves = ();
type ReserveIdentifier (line 90) | type ReserveIdentifier = [u8; 4];
type MaxLocks (line 91) | type MaxLocks = ();
type Balance (line 92) | type Balance = Balance;
type RuntimeEvent (line 93) | type RuntimeEvent = RuntimeEvent;
type DustRemoval (line 94) | type DustRemoval = ();
type ExistentialDeposit (line 95) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 96) | type AccountStore = System;
type WeightInfo (line 97) | type WeightInfo = ();
type RuntimeHoldReason (line 98) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 99) | type FreezeIdentifier = ();
type MaxFreezes (line 100) | type MaxFreezes = ();
type RuntimeFreezeReason (line 101) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 102) | type DoneSlashHandler = ();
type Precompiles (line 105) | pub type Precompiles<R> = PrecompileSetBuilder<
type PCall (line 121) | pub type PCall = BatchPrecompileCall<Runtime>;
constant BLOCK_STORAGE_LIMIT (line 127) | const BLOCK_STORAGE_LIMIT: u64 = 40 * 1024;
type FeeCalculator (line 141) | type FeeCalculator = ();
type GasWeightMapping (line 142) | type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;
type WeightPerGas (line 143) | type WeightPerGas = WeightPerGas;
type CallOrigin (line 144) | type CallOrigin = EnsureAddressRoot<AccountId>;
type WithdrawOrigin (line 145) | type WithdrawOrigin = EnsureAddressNever<AccountId>;
type AddressMapping (line 146) | type AddressMapping = AccountId;
type Currency (line 147) | type Currency = Balances;
type RuntimeEvent (line 148) | type RuntimeEvent = RuntimeEvent;
type Runner (line 149) | type Runner = pallet_evm::runner::stack::Runner<Self>;
type PrecompilesType (line 150) | type PrecompilesType = Precompiles<Runtime>;
type PrecompilesValue (line 151) | type PrecompilesValue = PrecompilesValue;
type ChainId (line 152) | type ChainId = ();
type OnChargeTransaction (line 153) | type OnChargeTransaction = ();
type BlockGasLimit (line 154) | type BlockGasLimit = BlockGasLimit;
type BlockHashMapping (line 155) | type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping<Self>;
type FindAuthor (line 156) | type FindAuthor = ();
type OnCreate (line 157) | type OnCreate = ();
type GasLimitPovSizeRatio (line 158) | type GasLimitPovSizeRatio = GasLimitPovSizeRatio;
type GasLimitStorageGrowthRatio (line 159) | type GasLimitStorageGrowthRatio = GasLimitStorageGrowthRatio;
type Timestamp (line 160) | type Timestamp = Timestamp;
type WeightInfo (line 161) | type WeightInfo = pallet_evm::weights::SubstrateWeight<Runtime>;
type AccountProvider (line 162) | type AccountProvider = FrameSystemAccountProvider<Runtime>;
type Moment (line 169) | type Moment = u64;
type OnTimestampSet (line 170) | type OnTimestampSet = ();
type MinimumPeriod (line 171) | type MinimumPeriod = MinimumPeriod;
type WeightInfo (line 172) | type WeightInfo = ();
type ExtBuilder (line 175) | pub(crate) struct ExtBuilder {
method with_balances (line 187) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method build (line 192) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 181) | fn default() -> ExtBuilder {
function balance (line 215) | pub fn balance(account: impl Into<AccountId>) -> Balance {
FILE: operator/precompiles/batch/src/tests.rs
function precompiles (line 33) | fn precompiles() -> Precompiles<Runtime> {
function evm_call (line 37) | fn evm_call(from: impl Into<H160>, input: Vec<u8>) -> EvmCall<Runtime> {
function costs (line 51) | fn costs() -> (u64, u64) {
function selectors (line 59) | fn selectors() {
function modifiers (line 74) | fn modifiers() {
function batch_some_empty (line 88) | fn batch_some_empty() {
function batch_some_until_failure_empty (line 107) | fn batch_some_until_failure_empty() {
function batch_all_empty (line 126) | fn batch_all_empty() {
function batch_returns (line 144) | fn batch_returns(
function batch_some_returns (line 237) | fn batch_some_returns() {
function batch_some_until_failure_returns (line 249) | fn batch_some_until_failure_returns() {
function batch_all_returns (line 261) | fn batch_all_returns() {
function batch_out_of_gas (line 272) | fn batch_out_of_gas(
function batch_some_out_of_gas (line 333) | fn batch_some_out_of_gas() {
function batch_some_until_failure_out_of_gas (line 342) | fn batch_some_until_failure_out_of_gas() {
function batch_all_out_of_gas (line 351) | fn batch_all_out_of_gas() {
function batch_incomplete (line 357) | fn batch_incomplete(
function batch_some_incomplete (line 478) | fn batch_some_incomplete() {
function batch_some_until_failure_incomplete (line 494) | fn batch_some_until_failure_incomplete() {
function batch_all_incomplete (line 508) | fn batch_all_incomplete() {
function batch_log_out_of_gas (line 515) | fn batch_log_out_of_gas(
function batch_all_log_out_of_gas (line 538) | fn batch_all_log_out_of_gas() {
function batch_some_log_out_of_gas (line 545) | fn batch_some_log_out_of_gas() {
function batch_some_until_failure_log_out_of_gas (line 554) | fn batch_some_until_failure_log_out_of_gas() {
function batch_call_out_of_gas (line 562) | fn batch_call_out_of_gas(
function batch_all_call_out_of_gas (line 585) | fn batch_all_call_out_of_gas() {
function batch_some_call_out_of_gas (line 592) | fn batch_some_call_out_of_gas() {
function batch_some_until_failure_call_out_of_gas (line 601) | fn batch_some_until_failure_call_out_of_gas() {
function batch_gas_limit (line 609) | fn batch_gas_limit(
function batch_all_gas_limit (line 632) | fn batch_all_gas_limit() {
function batch_some_gas_limit (line 639) | fn batch_some_gas_limit() {
function batch_some_until_failure_gas_limit (line 651) | fn batch_some_until_failure_gas_limit() {
function evm_batch_some_transfers_enough (line 660) | fn evm_batch_some_transfers_enough() {
function evm_batch_some_until_failure_transfers_enough (line 680) | fn evm_batch_some_until_failure_transfers_enough() {
function evm_batch_all_transfers_enough (line 700) | fn evm_batch_all_transfers_enough() {
function evm_batch_some_transfers_too_much (line 723) | fn evm_batch_some_transfers_too_much() {
function evm_batch_some_until_failure_transfers_too_much (line 758) | fn evm_batch_some_until_failure_transfers_too_much() {
function evm_batch_all_transfers_too_much (line 793) | fn evm_batch_all_transfers_too_much() {
function evm_batch_some_contract_revert (line 828) | fn evm_batch_some_contract_revert() {
function evm_batch_some_until_failure_contract_revert (line 863) | fn evm_batch_some_until_failure_contract_revert() {
function evm_batch_all_contract_revert (line 898) | fn evm_batch_all_contract_revert() {
function evm_batch_recursion_under_limit (line 933) | fn evm_batch_recursion_under_limit() {
function evm_batch_recursion_over_limit (line 965) | fn evm_batch_recursion_over_limit() {
function batch_is_not_callable_by_dummy_code (line 1004) | fn batch_is_not_callable_by_dummy_code() {
function test_solidity_interface_has_all_function_selectors_documented_and_implemented (line 1048) | fn test_solidity_interface_has_all_function_selectors_documented_and_imp...
FILE: operator/precompiles/call-permit/src/lib.rs
type Nonces (line 40) | pub struct Nonces;
constant STORAGE_PREFIX (line 43) | const STORAGE_PREFIX: &'static str = "Nonces";
method pallet_prefix (line 45) | fn pallet_prefix() -> &'static str {
type NoncesStorage (line 51) | pub type NoncesStorage = StorageMap<
constant PERMIT_TYPEHASH (line 62) | pub const PERMIT_TYPEHASH: [u8; 32] = keccak256!(
constant PERMIT_DOMAIN (line 68) | const PERMIT_DOMAIN: [u8; 32] = keccak256!(
constant CALL_DATA_LIMIT (line 72) | pub const CALL_DATA_LIMIT: u32 = 2u32.pow(16);
type CallPermitPrecompile (line 77) | pub struct CallPermitPrecompile<Runtime>(PhantomData<Runtime>);
function compute_domain_separator (line 84) | fn compute_domain_separator(address: H160) -> [u8; 32] {
function generate_permit (line 100) | pub fn generate_permit(
function dispatch_inherent_cost (line 131) | pub fn dispatch_inherent_cost() -> u64 {
function dispatch (line 139) | fn dispatch(
function nonces (line 243) | fn nonces(handle: &mut impl PrecompileHandle, owner: Address) -> EvmResu...
function domain_separator (line 256) | fn domain_separator(handle: &mut impl PrecompileHandle) -> EvmResult<H25...
FILE: operator/precompiles/call-permit/src/mock.rs
type AccountId (line 31) | pub type AccountId = MockAccount;
type Balance (line 32) | pub type Balance = u128;
type Block (line 34) | type Block = frame_system::mocking::MockBlockU32<Runtime>;
type BaseCallFilter (line 54) | type BaseCallFilter = Everything;
type DbWeight (line 55) | type DbWeight = ();
type RuntimeOrigin (line 56) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeTask (line 57) | type RuntimeTask = RuntimeTask;
type Nonce (line 58) | type Nonce = u64;
type Block (line 59) | type Block = Block;
type RuntimeCall (line 60) | type RuntimeCall = RuntimeCall;
type Hash (line 61) | type Hash = H256;
type Hashing (line 62) | type Hashing = BlakeTwo256;
type AccountId (line 63) | type AccountId = AccountId;
type Lookup (line 64) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 65) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 66) | type BlockHashCount = BlockHashCount;
type Version (line 67) | type Version = ();
type PalletInfo (line 68) | type PalletInfo = PalletInfo;
type AccountData (line 69) | type AccountData = pallet_balances::AccountData<Balance>;
type OnNewAccount (line 70) | type OnNewAccount = ();
type OnKilledAccount (line 71) | type OnKilledAccount = ();
type SystemWeightInfo (line 72) | type SystemWeightInfo = ();
type BlockWeights (line 73) | type BlockWeights = ();
type BlockLength (line 74) | type BlockLength = ();
type SS58Prefix (line 75) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 76) | type OnSetCode = ();
type MaxConsumers (line 77) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type SingleBlockMigrations (line 78) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 79) | type MultiBlockMigrator = ();
type PreInherents (line 80) | type PreInherents = ();
type PostInherents (line 81) | type PostInherents = ();
type PostTransactions (line 82) | type PostTransactions = ();
type ExtensionsWeightInfo (line 83) | type ExtensionsWeightInfo = ();
type MaxReserves (line 89) | type MaxReserves = ();
type ReserveIdentifier (line 90) | type ReserveIdentifier = [u8; 4];
type MaxLocks (line 91) | type MaxLocks = ();
type Balance (line 92) | type Balance = Balance;
type RuntimeEvent (line 93) | type RuntimeEvent = RuntimeEvent;
type DustRemoval (line 94) | type DustRemoval = ();
type ExistentialDeposit (line 95) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 96) | type AccountStore = System;
type WeightInfo (line 97) | type WeightInfo = ();
type RuntimeHoldReason (line 98) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 99) | type FreezeIdentifier = ();
type MaxFreezes (line 100) | type MaxFreezes = ();
type RuntimeFreezeReason (line 101) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 102) | type DoneSlashHandler = ();
type Precompiles (line 108) | pub type Precompiles<R> = PrecompileSetBuilder<
type PCall (line 116) | pub type PCall = CallPermitPrecompileCall<Runtime>;
type FeeCalculator (line 125) | type FeeCalculator = ();
type GasWeightMapping (line 126) | type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;
type WeightPerGas (line 127) | type WeightPerGas = WeightPerGas;
type CallOrigin (line 128) | type CallOrigin = EnsureAddressRoot<AccountId>;
type WithdrawOrigin (line 129) | type WithdrawOrigin = EnsureAddressNever<AccountId>;
type AddressMapping (line 130) | type AddressMapping = AccountId;
type Currency (line 131) | type Currency = Balances;
type RuntimeEvent (line 132) | type RuntimeEvent = RuntimeEvent;
type Runner (line 133) | type Runner = pallet_evm::runner::stack::Runner<Self>;
type PrecompilesType (line 134) | type PrecompilesType = Precompiles<Runtime>;
type PrecompilesValue (line 135) | type PrecompilesValue = PrecompilesValue;
type ChainId (line 136) | type ChainId = ();
type OnChargeTransaction (line 137) | type OnChargeTransaction = ();
type BlockGasLimit (line 138) | type BlockGasLimit = ();
type BlockHashMapping (line 139) | type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping<Self>;
type FindAuthor (line 140) | type FindAuthor = ();
type OnCreate (line 141) | type OnCreate = ();
type GasLimitPovSizeRatio (line 142) | type GasLimitPovSizeRatio = ();
type GasLimitStorageGrowthRatio (line 143) | type GasLimitStorageGrowthRatio = ();
type Timestamp (line 144) | type Timestamp = Timestamp;
type WeightInfo (line 145) | type WeightInfo = pallet_evm::weights::SubstrateWeight<Runtime>;
type AccountProvider (line 146) | type AccountProvider = FrameSystemAccountProvider<Runtime>;
type Moment (line 153) | type Moment = u64;
type OnTimestampSet (line 154) | type OnTimestampSet = ();
type MinimumPeriod (line 155) | type MinimumPeriod = MinimumPeriod;
type WeightInfo (line 156) | type WeightInfo = ();
type ExtBuilder (line 159) | pub(crate) struct ExtBuilder {
method with_balances (line 171) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method build (line 176) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 165) | fn default() -> ExtBuilder {
FILE: operator/precompiles/call-permit/src/tests.rs
function precompiles (line 27) | fn precompiles() -> Precompiles<Runtime> {
function dispatch_cost (line 31) | fn dispatch_cost() -> u64 {
function selectors (line 36) | fn selectors() {
function modifiers (line 43) | fn modifiers() {
function valid_permit_returns (line 57) | fn valid_permit_returns() {
function valid_permit_reverts (line 155) | fn valid_permit_reverts() {
function invalid_permit_nonce (line 253) | fn invalid_permit_nonce() {
function invalid_permit_gas_limit_too_low (line 319) | fn invalid_permit_gas_limit_too_low() {
function invalid_permit_gas_limit_overflow (line 385) | fn invalid_permit_gas_limit_overflow() {
function valid_permit_returns_with_metamask_signed_data (line 579) | fn valid_permit_returns_with_metamask_signed_data() {
function test_solidity_interface_has_all_function_selectors_documented_and_implemented (line 674) | fn test_solidity_interface_has_all_function_selectors_documented_and_imp...
FILE: operator/precompiles/collective/src/lib.rs
constant SYSTEM_ACCOUNT_SIZE (line 44) | pub const SYSTEM_ACCOUNT_SIZE: u64 = 148;
constant PROPOSAL_MAX_PROOF_SIZE (line 48) | pub const PROPOSAL_MAX_PROOF_SIZE: u64 = 256 * 1024;
constant SELECTOR_LOG_EXECUTED (line 51) | pub const SELECTOR_LOG_EXECUTED: [u8; 32] = keccak256!("Executed(bytes32...
constant SELECTOR_LOG_PROPOSED (line 54) | pub const SELECTOR_LOG_PROPOSED: [u8; 32] = keccak256!("Proposed(address...
constant SELECTOR_LOG_VOTED (line 57) | pub const SELECTOR_LOG_VOTED: [u8; 32] = keccak256!("Voted(address,bytes...
constant SELECTOR_LOG_CLOSED (line 60) | pub const SELECTOR_LOG_CLOSED: [u8; 32] = keccak256!("Closed(bytes32)");
function log_executed (line 62) | pub fn log_executed(address: impl Into<H160>, hash: H256) -> Log {
function log_proposed (line 66) | pub fn log_proposed(
function log_voted (line 83) | pub fn log_voted(address: impl Into<H160>, who: impl Into<H160>, hash: H...
function log_closed (line 93) | pub fn log_closed(address: impl Into<H160>, hash: H256) -> Log {
type GetProposalLimit (line 97) | type GetProposalLimit = ConstU32<{ 2u32.pow(16) }>;
type DecodeLimit (line 98) | type DecodeLimit = ConstU32<8>;
type CollectivePrecompile (line 100) | pub struct CollectivePrecompile<Runtime, Instance: 'static>(PhantomData<...
function execute (line 117) | fn execute(
function propose (line 158) | fn propose(
function vote (line 220) | fn vote(
function close (line 254) | fn close(
function proposal_hash (line 294) | fn proposal_hash(
function proposals (line 306) | fn proposals(handle: &mut impl PrecompileHandle) -> EvmResult<Vec<H256>> {
function members (line 320) | fn members(handle: &mut impl PrecompileHandle) -> EvmResult<Vec<Address>> {
function is_member (line 336) | fn is_member(handle: &mut impl PrecompileHandle, account: Address) -> Ev...
function prime (line 353) | fn prime(handle: &mut impl PrecompileHandle) -> EvmResult<Address> {
function hash (line 365) | pub fn hash<Runtime>(data: &[u8]) -> H256
FILE: operator/precompiles/collective/src/mock.rs
type AccountId (line 43) | pub type AccountId = MockAccount;
type Balance (line 44) | pub type Balance = u128;
type BlockNumber (line 45) | pub type BlockNumber = BlockNumberFor<Runtime>;
type Block (line 47) | type Block = frame_system::mocking::MockBlockU32<Runtime>;
type BaseCallFilter (line 67) | type BaseCallFilter = Everything;
type DbWeight (line 68) | type DbWeight = ();
type RuntimeOrigin (line 69) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeTask (line 70) | type RuntimeTask = RuntimeTask;
type Nonce (line 71) | type Nonce = u64;
type Block (line 72) | type Block = Block;
type RuntimeCall (line 73) | type RuntimeCall = RuntimeCall;
type Hash (line 74) | type Hash = H256;
type Hashing (line 75) | type Hashing = BlakeTwo256;
type AccountId (line 76) | type AccountId = AccountId;
type Lookup (line 77) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 78) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 79) | type BlockHashCount = BlockHashCount;
type Version (line 80) | type Version = ();
type PalletInfo (line 81) | type PalletInfo = PalletInfo;
type AccountData (line 82) | type AccountData = pallet_balances::AccountData<Balance>;
type OnNewAccount (line 83) | type OnNewAccount = ();
type OnKilledAccount (line 84) | type OnKilledAccount = ();
type SystemWeightInfo (line 85) | type SystemWeightInfo = ();
type BlockWeights (line 86) | type BlockWeights = ();
type BlockLength (line 87) | type BlockLength = ();
type SS58Prefix (line 88) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 89) | type OnSetCode = ();
type MaxConsumers (line 90) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type SingleBlockMigrations (line 91) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 92) | type MultiBlockMigrator = ();
type PreInherents (line 93) | type PreInherents = ();
type PostInherents (line 94) | type PostInherents = ();
type PostTransactions (line 95) | type PostTransactions = ();
type ExtensionsWeightInfo (line 96) | type ExtensionsWeightInfo = ();
type MaxReserves (line 104) | type MaxReserves = ();
type ReserveIdentifier (line 105) | type ReserveIdentifier = ();
type MaxLocks (line 106) | type MaxLocks = ();
type Balance (line 107) | type Balance = Balance;
type RuntimeEvent (line 108) | type RuntimeEvent = RuntimeEvent;
type DustRemoval (line 109) | type DustRemoval = ();
type ExistentialDeposit (line 110) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 111) | type AccountStore = System;
type WeightInfo (line 112) | type WeightInfo = ();
type RuntimeHoldReason (line 113) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 114) | type FreezeIdentifier = ();
type MaxFreezes (line 115) | type MaxFreezes = ();
type RuntimeFreezeReason (line 116) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 117) | type DoneSlashHandler = ();
type Precompiles (line 120) | pub type Precompiles<R> = PrecompileSetBuilder<
type PCall (line 125) | pub type PCall = CollectivePrecompileCall<Runtime, pallet_collective::In...
constant BLOCK_STORAGE_LIMIT (line 128) | const BLOCK_STORAGE_LIMIT: u64 = 40 * 1024;
type FeeCalculator (line 142) | type FeeCalculator = ();
type GasWeightMapping (line 143) | type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;
type WeightPerGas (line 144) | type WeightPerGas = WeightPerGas;
type CallOrigin (line 145) | type CallOrigin = EnsureAddressRoot<AccountId>;
type WithdrawOrigin (line 146) | type WithdrawOrigin = EnsureAddressNever<AccountId>;
type AddressMapping (line 147) | type AddressMapping = AccountId;
type Currency (line 148) | type Currency = Balances;
type RuntimeEvent (line 149) | type RuntimeEvent = RuntimeEvent;
type Runner (line 150) | type Runner = pallet_evm::runner::stack::Runner<Self>;
type PrecompilesType (line 151) | type PrecompilesType = Precompiles<Self>;
type PrecompilesValue (line 152) | type PrecompilesValue = PrecompilesValue;
type ChainId (line 153) | type ChainId = ();
type OnChargeTransaction (line 154) | type OnChargeTransaction = ();
type BlockGasLimit (line 155) | type BlockGasLimit = BlockGasLimit;
type BlockHashMapping (line 156) | type BlockHashMapping = SubstrateBlockHashMapping<Self>;
type FindAuthor (line 157) | type FindAuthor = ();
type OnCreate (line 158) | type OnCreate = ();
type GasLimitPovSizeRatio (line 159) | type GasLimitPovSizeRatio = GasLimitPovSizeRatio;
type GasLimitStorageGrowthRatio (line 160) | type GasLimitStorageGrowthRatio = GasLimitStorageGrowthRatio;
type Timestamp (line 161) | type Timestamp = Timestamp;
type WeightInfo (line 162) | type WeightInfo = pallet_evm::weights::SubstrateWeight<Runtime>;
type AccountProvider (line 163) | type AccountProvider = FrameSystemAccountProvider<Runtime>;
type Moment (line 170) | type Moment = u64;
type OnTimestampSet (line 171) | type OnTimestampSet = ();
type MinimumPeriod (line 172) | type MinimumPeriod = MinimumPeriod;
type WeightInfo (line 173) | type WeightInfo = ();
type BenchmarkHelper (line 197) | pub struct BenchmarkHelper;
method create_asset_kind (line 200) | fn create_asset_kind(_seed: u32) -> () {
method create_beneficiary (line 204) | fn create_beneficiary(seed: [u8; 32]) -> AccountId {
type PalletId (line 210) | type PalletId = TreasuryId;
type Currency (line 211) | type Currency = Balances;
type RejectOrigin (line 212) | type RejectOrigin = frame_support::traits::NeverEnsureOrigin<Balance>;
type RuntimeEvent (line 213) | type RuntimeEvent = RuntimeEvent;
type SpendPeriod (line 215) | type SpendPeriod = ConstU32<1>;
type Burn (line 216) | type Burn = ();
type BurnDestination (line 217) | type BurnDestination = ();
type MaxApprovals (line 218) | type MaxApprovals = ConstU32<100>;
type WeightInfo (line 219) | type WeightInfo = pallet_treasury::weights::SubstrateWeight<Runtime>;
type SpendFunds (line 220) | type SpendFunds = ();
type SpendOrigin (line 221) | type SpendOrigin = MapSuccess<
type AssetKind (line 225) | type AssetKind = ();
type Beneficiary (line 226) | type Beneficiary = AccountId;
type BeneficiaryLookup (line 227) | type BeneficiaryLookup = IdentityLookup<AccountId>;
type Paymaster (line 228) | type Paymaster = PayFromAccount<Balances, TreasuryAccount>;
type BalanceConverter (line 229) | type BalanceConverter = UnityAssetBalanceConversion;
type PayoutPeriod (line 230) | type PayoutPeriod = ConstU32<0>;
type BenchmarkHelper (line 232) | type BenchmarkHelper = BenchmarkHelper;
type BlockNumberProvider (line 233) | type BlockNumberProvider = System;
type RuntimeOrigin (line 241) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeEvent (line 242) | type RuntimeEvent = RuntimeEvent;
type Proposal (line 243) | type Proposal = RuntimeCall;
type MotionDuration (line 246) | type MotionDuration = ConstU32<2>;
type MaxProposals (line 248) | type MaxProposals = ConstU32<100>;
type MaxMembers (line 250) | type MaxMembers = ConstU32<100>;
type DefaultVote (line 251) | type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote;
type WeightInfo (line 252) | type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>;
type SetMembersOrigin (line 253) | type SetMembersOrigin = frame_system::EnsureRoot<AccountId>;
type MaxProposalWeight (line 254) | type MaxProposalWeight = MaxProposalWeight;
type KillOrigin (line 255) | type KillOrigin = EnsureRoot<AccountId>;
type DisapproveOrigin (line 256) | type DisapproveOrigin = EnsureRoot<AccountId>;
type Consideration (line 257) | type Consideration = ();
type ExtBuilder (line 261) | pub(crate) struct ExtBuilder {
method with_balances (line 280) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method with_collective (line 287) | pub(crate) fn with_collective(mut self, collective: Vec<AccountId>) ->...
method build (line 294) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 269) | fn default() -> ExtBuilder {
function roll_to (line 321) | pub(crate) fn roll_to(n: BlockNumber) {
function events (line 342) | pub(crate) fn events() -> Vec<RuntimeEvent> {
FILE: operator/precompiles/collective/src/tests.rs
function precompiles (line 27) | fn precompiles() -> Precompiles<Runtime> {
function test_solidity_interface_has_all_function_selectors_documented_and_implemented (line 32) | fn test_solidity_interface_has_all_function_selectors_documented_and_imp...
function selector_less_than_four_bytes (line 37) | fn selector_less_than_four_bytes() {
function no_selector_exists_but_length_is_right (line 47) | fn no_selector_exists_but_length_is_right() {
function selectors (line 56) | fn selectors() {
function modifiers (line 69) | fn modifiers() {
function non_member_cannot_propose (line 89) | fn non_member_cannot_propose() {
function non_member_cannot_vote (line 113) | fn non_member_cannot_vote() {
function non_member_cannot_execute (line 131) | fn non_member_cannot_execute() {
function cannot_vote_for_unknown_proposal (line 154) | fn cannot_vote_for_unknown_proposal() {
function cannot_close_unknown_proposal (line 172) | fn cannot_close_unknown_proposal() {
function member_can_make_instant_proposal (line 191) | fn member_can_make_instant_proposal() {
function member_can_make_delayed_proposal (line 224) | fn member_can_make_delayed_proposal() {
function member_can_vote_on_proposal (line 257) | fn member_can_vote_on_proposal() {
function cannot_close_if_not_enough_votes (line 304) | fn cannot_close_if_not_enough_votes() {
function can_close_execute_if_enough_votes (line 344) | fn can_close_execute_if_enough_votes() {
function can_close_refuse_if_enough_votes (line 432) | fn can_close_refuse_if_enough_votes() {
function multiple_propose_increase_index (line 507) | fn multiple_propose_increase_index() {
function view_members (line 552) | fn view_members() {
function view_no_prime (line 562) | fn view_no_prime() {
function view_some_prime (line 572) | fn view_some_prime() {
function view_is_member (line 592) | fn view_is_member() {
function scenario (line 623) | fn scenario<F>(nesting: usize, call: F)
function proposal_above_bound (line 661) | fn proposal_above_bound() {
function proposal_below_bound (line 669) | fn proposal_below_bound() {
function execute_above_bound (line 677) | fn execute_above_bound() {
function execute_below_bound (line 682) | fn execute_below_bound() {
FILE: operator/precompiles/conviction-voting/src/lib.rs
type BalanceOf (line 40) | type BalanceOf<Runtime> = <<Runtime as pallet_conviction_voting::Config>...
type IndexOf (line 43) | type IndexOf<Runtime> = <<Runtime as pallet_conviction_voting::Config>::...
type ClassOf (line 51) | type ClassOf<Runtime> = <<Runtime as pallet_conviction_voting::Config>::...
type VotingOf (line 59) | type VotingOf<Runtime> = Voting<
constant SYSTEM_ACCOUNT_SIZE (line 69) | pub const SYSTEM_ACCOUNT_SIZE: u64 = 148;
constant SELECTOR_LOG_VOTED (line 72) | pub(crate) const SELECTOR_LOG_VOTED: [u8; 32] =
constant SELECTOR_LOG_VOTE_SPLIT (line 76) | pub(crate) const SELECTOR_LOG_VOTE_SPLIT: [u8; 32] =
constant SELECTOR_LOG_VOTE_SPLIT_ABSTAINED (line 80) | pub(crate) const SELECTOR_LOG_VOTE_SPLIT_ABSTAINED: [u8; 32] =
constant SELECTOR_LOG_VOTE_REMOVED (line 84) | pub(crate) const SELECTOR_LOG_VOTE_REMOVED: [u8; 32] = keccak256!("VoteR...
constant SELECTOR_LOG_VOTE_REMOVED_FOR_TRACK (line 87) | pub(crate) const SELECTOR_LOG_VOTE_REMOVED_FOR_TRACK: [u8; 32] =
constant SELECTOR_LOG_VOTE_REMOVED_OTHER (line 91) | pub(crate) const SELECTOR_LOG_VOTE_REMOVED_OTHER: [u8; 32] =
constant SELECTOR_LOG_DELEGATED (line 95) | pub(crate) const SELECTOR_LOG_DELEGATED: [u8; 32] =
constant SELECTOR_LOG_UNDELEGATED (line 99) | pub(crate) const SELECTOR_LOG_UNDELEGATED: [u8; 32] = keccak256!("Undele...
constant SELECTOR_LOG_UNLOCKED (line 102) | pub(crate) const SELECTOR_LOG_UNLOCKED: [u8; 32] = keccak256!("Unlocked(...
type ConvictionVotingPrecompile (line 105) | pub struct ConvictionVotingPrecompile<Runtime>(PhantomData<Runtime>);
function vote (line 131) | fn vote(
function vote_yes (line 156) | fn vote_yes(
function vote_no (line 182) | fn vote_no(
function vote_split (line 208) | fn vote_split(
function vote_split_abstain (line 224) | fn vote_split_abstain(
function remove_vote (line 239) | fn remove_vote(handle: &mut impl PrecompileHandle, poll_index: u32) -> E...
function remove_vote_for_track (line 244) | fn remove_vote_for_track(
function rm_vote (line 253) | fn rm_vote(
function remove_other_vote (line 304) | fn remove_other_vote(
function delegate (line 348) | fn delegate(
function undelegate (line 398) | fn undelegate(handle: &mut impl PrecompileHandle, track_id: u16) -> EvmR...
function unlock (line 421) | fn unlock(handle: &mut impl PrecompileHandle, track_id: u16, target: Add...
function voting_for (line 454) | fn voting_for(
function class_locks_for (line 472) | fn class_locks_for(
function u8_to_conviction (line 503) | fn u8_to_conviction(conviction: u8) -> MayRevert<Conviction> {
function u32_to_index (line 509) | fn u32_to_index(index: u32) -> MayRevert<IndexOf<Runtime>> {
function u16_to_track_id (line 515) | fn u16_to_track_id(class: u16) -> MayRevert<ClassOf<Runtime>> {
function track_id_to_u16 (line 521) | fn track_id_to_u16(class: ClassOf<Runtime>) -> MayRevert<u16> {
function u256_to_amount (line 527) | fn u256_to_amount(value: U256) -> MayRevert<BalanceOf<Runtime>> {
function log_vote_event (line 533) | fn log_vote_event(
function voting_to_output (line 596) | fn voting_to_output(voting: VotingOf<Runtime>) -> MayRevert<OutputVoting...
type OutputClassLock (line 689) | pub struct OutputClassLock {
type OutputVotingFor (line 695) | pub struct OutputVotingFor {
type OutputCasting (line 703) | pub struct OutputCasting {
type PollAccountVote (line 710) | pub struct PollAccountVote {
type OutputDelegating (line 716) | pub struct OutputDelegating {
type OutputAccountVote (line 725) | pub struct OutputAccountVote {
type StandardVote (line 735) | pub struct StandardVote {
type OutputVote (line 741) | pub struct OutputVote {
type SplitVote (line 747) | pub struct SplitVote {
type SplitAbstainVote (line 753) | pub struct SplitAbstainVote {
type Delegations (line 760) | pub struct Delegations {
type PriorLock (line 766) | pub struct PriorLock {
FILE: operator/precompiles/conviction-voting/src/mock.rs
type AccountId (line 37) | pub type AccountId = MockAccount;
type Balance (line 38) | pub type Balance = u128;
type Block (line 40) | type Block = frame_system::mocking::MockBlock<Runtime>;
type BaseCallFilter (line 61) | type BaseCallFilter = Everything;
type DbWeight (line 62) | type DbWeight = ();
type RuntimeOrigin (line 63) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeTask (line 64) | type RuntimeTask = RuntimeTask;
type Nonce (line 65) | type Nonce = u64;
type Block (line 66) | type Block = Block;
type RuntimeCall (line 67) | type RuntimeCall = RuntimeCall;
type Hash (line 68) | type Hash = H256;
type Hashing (line 69) | type Hashing = BlakeTwo256;
type AccountId (line 70) | type AccountId = AccountId;
type Lookup (line 71) | type Lookup = IdentityLookup<AccountId>;
type RuntimeEvent (line 72) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 73) | type BlockHashCount = BlockHashCount;
type Version (line 74) | type Version = ();
type PalletInfo (line 75) | type PalletInfo = PalletInfo;
type AccountData (line 76) | type AccountData = pallet_balances::AccountData<Balance>;
type OnNewAccount (line 77) | type OnNewAccount = ();
type OnKilledAccount (line 78) | type OnKilledAccount = ();
type SystemWeightInfo (line 79) | type SystemWeightInfo = ();
type BlockWeights (line 80) | type BlockWeights = ();
type BlockLength (line 81) | type BlockLength = ();
type SS58Prefix (line 82) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 83) | type OnSetCode = ();
type MaxConsumers (line 84) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type SingleBlockMigrations (line 85) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 86) | type MultiBlockMigrator = ();
type PreInherents (line 87) | type PreInherents = ();
type PostInherents (line 88) | type PostInherents = ();
type PostTransactions (line 89) | type PostTransactions = ();
type ExtensionsWeightInfo (line 90) | type ExtensionsWeightInfo = ();
type MaxReserves (line 96) | type MaxReserves = ();
type ReserveIdentifier (line 97) | type ReserveIdentifier = [u8; 4];
type MaxLocks (line 98) | type MaxLocks = ();
type Balance (line 99) | type Balance = Balance;
type RuntimeEvent (line 100) | type RuntimeEvent = RuntimeEvent;
type DustRemoval (line 101) | type DustRemoval = ();
type ExistentialDeposit (line 102) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 103) | type AccountStore = System;
type WeightInfo (line 104) | type WeightInfo = ();
type RuntimeHoldReason (line 105) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 106) | type FreezeIdentifier = ();
type MaxFreezes (line 107) | type MaxFreezes = ();
type RuntimeFreezeReason (line 108) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 109) | type DoneSlashHandler = ();
constant BLOCK_STORAGE_LIMIT (line 113) | const BLOCK_STORAGE_LIMIT: u64 = 40 * 1024;
type Precompiles (line 126) | pub type Precompiles<R> =
type PCall (line 129) | pub type PCall = ConvictionVotingPrecompileCall<Runtime>;
type FeeCalculator (line 132) | type FeeCalculator = ();
type GasWeightMapping (line 133) | type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;
type WeightPerGas (line 134) | type WeightPerGas = WeightPerGas;
type CallOrigin (line 135) | type CallOrigin = EnsureAddressRoot<AccountId>;
type WithdrawOrigin (line 136) | type WithdrawOrigin = EnsureAddressNever<AccountId>;
type AddressMapping (line 137) | type AddressMapping = AccountId;
type Currency (line 138) | type Currency = Balances;
type RuntimeEvent (line 139) | type RuntimeEvent = RuntimeEvent;
type Runner (line 140) | type Runner = pallet_evm::runner::stack::Runner<Self>;
type PrecompilesType (line 141) | type PrecompilesType = Precompiles<Runtime>;
type PrecompilesValue (line 142) | type PrecompilesValue = PrecompilesValue;
type ChainId (line 143) | type ChainId = ();
type OnChargeTransaction (line 144) | type OnChargeTransaction = ();
type BlockGasLimit (line 145) | type BlockGasLimit = BlockGasLimit;
type BlockHashMapping (line 146) | type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping<Self>;
type FindAuthor (line 147) | type FindAuthor = ();
type OnCreate (line 148) | type OnCreate = ();
type GasLimitPovSizeRatio (line 149) | type GasLimitPovSizeRatio = GasLimitPovSizeRatio;
type GasLimitStorageGrowthRatio (line 150) | type GasLimitStorageGrowthRatio = GasLimitStorageGrowthRatio;
type Timestamp (line 151) | type Timestamp = Timestamp;
type WeightInfo (line 152) | type WeightInfo = pallet_evm::weights::SubstrateWeight<Runtime>;
type AccountProvider (line 153) | type AccountProvider = FrameSystemAccountProvider<Runtime>;
type Moment (line 160) | type Moment = u64;
type OnTimestampSet (line 161) | type OnTimestampSet = ();
type MinimumPeriod (line 162) | type MinimumPeriod = MinimumPeriod;
type WeightInfo (line 163) | type WeightInfo = ();
type TestPollState (line 167) | pub enum TestPollState {
type TestPolls (line 181) | pub struct TestPolls;
type Index (line 183) | type Index = u8;
type Votes (line 184) | type Votes = u128;
type Moment (line 185) | type Moment = u64;
type Class (line 186) | type Class = u8;
method classes (line 187) | fn classes() -> Vec<u8> {
method as_ongoing (line 190) | fn as_ongoing(index: u8) -> Option<(TallyOf<Runtime>, Self::Class)> {
method access_poll (line 199) | fn access_poll<R>(
method try_access_poll (line 218) | fn try_access_poll<R>(
method create_ongoing (line 239) | fn create_ongoing(class: Self::Class) -> Result<Self::Index, ()> {
method end_ongoing (line 248) | fn end_ongoing(index: Self::Index, approved: bool) -> Result<(), ()> {
type RuntimeEvent (line 262) | type RuntimeEvent = RuntimeEvent;
type Currency (line 263) | type Currency = pallet_balances::Pallet<Self>;
type VoteLockingPeriod (line 264) | type VoteLockingPeriod = ConstU64<3>;
type MaxVotes (line 265) | type MaxVotes = ConstU32<3>;
type WeightInfo (line 266) | type WeightInfo = ();
type MaxTurnout (line 267) | type MaxTurnout = TotalIssuanceOf<Balances, Self::AccountId>;
type Polls (line 268) | type Polls = TestPolls;
type ExtBuilder (line 271) | pub(crate) struct ExtBuilder {
method with_balances (line 284) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method build (line 290) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 277) | fn default() -> ExtBuilder {
function events (line 309) | pub(crate) fn events() -> Vec<RuntimeEvent> {
FILE: operator/precompiles/conviction-voting/src/tests.rs
constant ONGOING_POLL_INDEX (line 31) | const ONGOING_POLL_INDEX: u32 = 3;
function precompiles (line 33) | fn precompiles() -> Precompiles<Runtime> {
function evm_call (line 37) | fn evm_call(input: Vec<u8>) -> EvmCall<Runtime> {
function test_solidity_interface_has_all_function_selectors_documented_and_implemented (line 52) | fn test_solidity_interface_has_all_function_selectors_documented_and_imp...
function standard_vote (line 59) | fn standard_vote(
function split_vote (line 83) | fn split_vote(
function standard_vote_logs_work (line 110) | fn standard_vote_logs_work() {
function split_vote_logs_work (line 164) | fn split_vote_logs_work() {
function remove_vote_logs_work (line 221) | fn remove_vote_logs_work() {
function remove_vote_for_track_logs_work (line 252) | fn remove_vote_for_track_logs_work() {
function remove_other_vote_logs_work (line 287) | fn remove_other_vote_logs_work() {
function delegate_undelegate_logs_work (line 324) | fn delegate_undelegate_logs_work() {
function unlock_logs_work (line 377) | fn unlock_logs_work() {
function test_voting_for_returns_correct_value_for_standard_vote (line 416) | fn test_voting_for_returns_correct_value_for_standard_vote() {
function test_voting_for_returns_correct_value_for_split_vote (line 463) | fn test_voting_for_returns_correct_value_for_split_vote() {
function test_voting_for_returns_correct_value_for_split_abstain_vote (line 507) | fn test_voting_for_returns_correct_value_for_split_abstain_vote() {
function test_class_locks_for_returns_correct_value (line 556) | fn test_class_locks_for_returns_correct_value() {
FILE: operator/precompiles/datahaven-native-transfer/src/lib.rs
constant SELECTOR_LOG_TOKENS_LOCKED (line 38) | pub const SELECTOR_LOG_TOKENS_LOCKED: [u8; 32] = keccak256!("TokensLocke...
constant SELECTOR_LOG_TOKENS_TRANSFERRED_TO_ETHEREUM (line 42) | pub const SELECTOR_LOG_TOKENS_TRANSFERRED_TO_ETHEREUM: [u8; 32] =
type BalanceOf (line 50) | type BalanceOf<Runtime> =
type DataHavenNativeTransferPrecompile (line 56) | pub struct DataHavenNativeTransferPrecompile<Runtime>(PhantomData<Runtim...
function transfer_to_ethereum (line 81) | fn transfer_to_ethereum(
function is_paused (line 160) | fn is_paused(handle: &mut impl PrecompileHandle) -> EvmResult<bool> {
function total_locked_balance (line 179) | fn total_locked_balance(handle: &mut impl PrecompileHandle) -> EvmResult...
function ethereum_sovereign_account (line 201) | fn ethereum_sovereign_account(handle: &mut impl PrecompileHandle) -> Evm...
FILE: operator/precompiles/datahaven-native-transfer/src/mock.rs
type AccountId (line 37) | pub type AccountId = MockAccount;
type Balance (line 38) | pub type Balance = u128;
type Block (line 40) | type Block = frame_system::mocking::MockBlockU32<Runtime>;
type BaseCallFilter (line 62) | type BaseCallFilter = Everything;
type DbWeight (line 63) | type DbWeight = ();
type RuntimeOrigin (line 64) | type RuntimeOrigin = RuntimeOrigin;
type RuntimeTask (line 65) | type RuntimeTask = RuntimeTask;
type Nonce (line 66) | type Nonce = u64;
type Block (line 67) | type Block = Block;
type RuntimeCall (line 68) | type RuntimeCall = RuntimeCall;
type Hash (line 69) | type Hash = H256;
type Hashing (line 70) | type Hashing = BlakeTwo256;
type AccountId (line 71) | type AccountId = AccountId;
type Lookup (line 72) | type Lookup = IdentityLookup<Self::AccountId>;
type RuntimeEvent (line 73) | type RuntimeEvent = RuntimeEvent;
type BlockHashCount (line 74) | type BlockHashCount = BlockHashCount;
type Version (line 75) | type Version = ();
type PalletInfo (line 76) | type PalletInfo = PalletInfo;
type AccountData (line 77) | type AccountData = pallet_balances::AccountData<Balance>;
type OnNewAccount (line 78) | type OnNewAccount = ();
type OnKilledAccount (line 79) | type OnKilledAccount = ();
type SystemWeightInfo (line 80) | type SystemWeightInfo = ();
type BlockWeights (line 81) | type BlockWeights = ();
type BlockLength (line 82) | type BlockLength = ();
type SS58Prefix (line 83) | type SS58Prefix = SS58Prefix;
type OnSetCode (line 84) | type OnSetCode = ();
type MaxConsumers (line 85) | type MaxConsumers = frame_support::traits::ConstU32<16>;
type SingleBlockMigrations (line 86) | type SingleBlockMigrations = ();
type MultiBlockMigrator (line 87) | type MultiBlockMigrator = ();
type PreInherents (line 88) | type PreInherents = ();
type PostInherents (line 89) | type PostInherents = ();
type PostTransactions (line 90) | type PostTransactions = ();
type ExtensionsWeightInfo (line 91) | type ExtensionsWeightInfo = ();
type MaxReserves (line 99) | type MaxReserves = ();
type ReserveIdentifier (line 100) | type ReserveIdentifier = [u8; 4];
type MaxLocks (line 101) | type MaxLocks = ();
type Balance (line 102) | type Balance = Balance;
type RuntimeEvent (line 103) | type RuntimeEvent = RuntimeEvent;
type DustRemoval (line 104) | type DustRemoval = ();
type ExistentialDeposit (line 105) | type ExistentialDeposit = ExistentialDeposit;
type AccountStore (line 106) | type AccountStore = System;
type WeightInfo (line 107) | type WeightInfo = ();
type RuntimeHoldReason (line 108) | type RuntimeHoldReason = ();
type FreezeIdentifier (line 109) | type FreezeIdentifier = ();
type MaxFreezes (line 110) | type MaxFreezes = ();
type RuntimeFreezeReason (line 111) | type RuntimeFreezeReason = ();
type DoneSlashHandler (line 112) | type DoneSlashHandler = ();
type Precompiles (line 115) | pub type Precompiles<R> =
type PCall (line 118) | pub type PCall = DataHavenNativeTransferPrecompileCall<Runtime>;
constant MAX_POV_SIZE (line 127) | const MAX_POV_SIZE: u64 = 5 * 1024 * 1024;
constant BLOCK_STORAGE_LIMIT (line 128) | const BLOCK_STORAGE_LIMIT: u64 = 40 * 1024;
type FeeCalculator (line 145) | type FeeCalculator = ();
type GasWeightMapping (line 146) | type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;
type WeightPerGas (line 147) | type WeightPerGas = WeightPerGas;
type CallOrigin (line 148) | type CallOrigin = EnsureAddressRoot<AccountId>;
type WithdrawOrigin (line 149) | type WithdrawOrigin = EnsureAddressNever<AccountId>;
type AddressMapping (line 150) | type AddressMapping = AccountId;
type Currency (line 151) | type Currency = Balances;
type RuntimeEvent (line 152) | type RuntimeEvent = RuntimeEvent;
type Runner (line 153) | type Runner = pallet_evm::runner::stack::Runner<Self>;
type PrecompilesType (line 154) | type PrecompilesType = Precompiles<Runtime>;
type PrecompilesValue (line 155) | type PrecompilesValue = PrecompilesValue;
type ChainId (line 156) | type ChainId = ();
type OnChargeTransaction (line 157) | type OnChargeTransaction = ();
type BlockGasLimit (line 158) | type BlockGasLimit = BlockGasLimit;
type BlockHashMapping (line 159) | type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping<Self>;
type FindAuthor (line 160) | type FindAuthor = ();
type OnCreate (line 161) | type OnCreate = ();
type GasLimitPovSizeRatio (line 162) | type GasLimitPovSizeRatio = GasLimitPovSizeRatio;
type GasLimitStorageGrowthRatio (line 163) | type GasLimitStorageGrowthRatio = GasLimitStorageGrowthRatio;
type Timestamp (line 164) | type Timestamp = Timestamp;
type WeightInfo (line 165) | type WeightInfo = pallet_evm::weights::SubstrateWeight<Runtime>;
type AccountProvider (line 166) | type AccountProvider = FrameSystemAccountProvider<Runtime>;
type Moment (line 174) | type Moment = u64;
type OnTimestampSet (line 175) | type OnTimestampSet = ();
type MinimumPeriod (line 176) | type MinimumPeriod = MinimumPeriod;
type WeightInfo (line 177) | type WeightInfo = ();
type MockOutboundQueue (line 181) | pub struct MockOutboundQueue;
type Ticket (line 184) | type Ticket = MockTicket;
method validate (line 186) | fn validate(_message: &Message) -> Result<Self::Ticket, SendError> {
method deliver (line 191) | fn deliver(_ticket: Self::Ticket) -> Result<H256, SendError> {
type MockTicket (line 198) | pub struct MockTicket;
method message_id (line 201) | fn message_id(&self) -> H256 {
type EnsureAccountZero (line 215) | pub struct EnsureAccountZero;
type Success (line 217) | type Success = AccountId;
method try_origin (line 219) | fn try_origin(o: RuntimeOrigin) -> Result<Self::Success, RuntimeOrigin> {
type RuntimeEvent (line 232) | type RuntimeEvent = RuntimeEvent;
type Currency (line 233) | type Currency = Balances;
type EthereumSovereignAccount (line 234) | type EthereumSovereignAccount = EthereumSovereignAccountParam;
type OutboundQueue (line 235) | type OutboundQueue = MockOutboundQueue;
type FeeRecipient (line 236) | type FeeRecipient = FeeRecipientParam;
type WeightInfo (line 237) | type WeightInfo = ();
type PauseOrigin (line 238) | type PauseOrigin = EnsureAccountZero;
type NativeTokenId (line 239) | type NativeTokenId = NativeTokenIdParam;
type ExtBuilder (line 242) | pub(crate) struct ExtBuilder {
method with_balances (line 257) | pub(crate) fn with_balances(mut self, balances: Vec<(AccountId, Balanc...
method without_native_token (line 263) | pub(crate) fn without_native_token(mut self) -> Self {
method build (line 268) | pub(crate) fn build(self) -> sp_io::TestExternalities {
method default (line 248) | fn default() -> ExtBuilder {
function precompiles (line 293) | pub(crate) fn precompiles() -> Precompiles<Runtime> {
function balance (line 297) | pub(crate) fn balance(account: impl Into<AccountId>) -> Balance {
FILE: operator/precompiles/datahaven-native-transfer/src/tests.rs
function precompile_address (line 28) | fn precompile_address() -> H160 {
function test_selectors (line 37) | fn test_selectors() {
function test_function_modifiers (line 49) | fn test_function_modifiers() {
function test_transfer_to_ethereum_success (line 73) | fn test_transfer_to_ethereum_success() {
function test_transfer_to_ethereum_zero_address (line 115) | fn test_transfer_to_ethereum_zero_address() {
function test_transfer_to_ethereum_zero_amount (line 139) | fn test_transfer_to_ethereum_zero_amount() {
function test_transfer_to_ethereum_zero_fee (line 163) | fn test_transfer_to_ethereum_zero_fee() {
function test_transfer_to_ethereum_insufficient_balance (line 187) | fn test_transfer_to_ethereum_insufficient_balance() {
function test_transfer_to_ethereum_multiple_transfers (line 215) | fn test_transfer_to_ethereum_multiple_transfers() {
function test_transfer_to_ethereum_large_amount (line 265) | fn test_transfer_to_ethereum_large_amount() {
function test_total_locked_balance_zero (line 296) | fn test_total_locked_balance_zero() {
function test_total_locked_balance_with_existential_deposit (line 305) | fn test_total_locked_balance_with_existential_deposit() {
function test_total_locked_balance_after_transfer (line 317) | fn test_total_locked_balance_after_transfer() {
function test_total_locked_balance_after_multiple_transfers (line 350) | fn test_total_locked_balance_after_multiple_transfers() {
function test_ethereum_sovereign_account (line 397) | fn test_ethereum_sovereign_account() {
function test_transfer_to_ethereum_gas_cost (line 416) | fn test_transfer_to_ethereum_gas_cost() {
function test_view_functions_gas_costs (line 444) | fn test_view_functions_gas_costs() {
function test_transfer_respects_existential_deposit (line 472) | fn test_transfer_respects_existential_deposit() {
function test_u256_to_balance_overflow (line 503) | fn test_u256_to_balance_overflow() {
function test_fee_overflow (line 528) | fn test_fee_overflow() {
function from_utf8_lossy (line 552) | fn from_utf8_lossy(bytes: &[u8]) -> String {
FILE: operator/precompiles/erc20-balances/src/eip
Copy disabled (too large)
Download .json
Condensed preview — 989 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,860K chars).
[
{
"path": ".github/CODEOWNERS",
"chars": 487,
"preview": "# Default code owners for the repo\n# (This restriction will be lifted at some point)\n* @datahaven-xyz/moonsong-perm @dat"
},
{
"path": ".github/workflow-templates/build-prod-binary/action.yml",
"chars": 1766,
"preview": "name: Build Production Binary\ndescription: |\n Builds production a DataHaven binary for a given CPU target\n\ninputs:\n ta"
},
{
"path": ".github/workflow-templates/publish-docker/action.yml",
"chars": 3703,
"preview": "name: Publish docker image\ndescription: |\n Publish docker image tags to container registry\n\ninputs:\n dockerfile:\n d"
},
{
"path": ".github/workflows/CI.yml",
"chars": 2531,
"preview": "#! Main CI Specification for DataHaven Repository\n#!\n#! This workflow runs validation checks on pull requests.\n#! For ma"
},
{
"path": ".github/workflows/actions/cleanup-runner/action.yml",
"chars": 2953,
"preview": "name: \"Cleanup Runner\"\ndescription: \"Cleans up the runner environment to free up disk space\"\n\nruns:\n using: \"composite\""
},
{
"path": ".github/workflows/actions/setup-env/action.yml",
"chars": 11303,
"preview": "name: \"Setup Rust Environment\"\ndescription: \"Creates a Rust environment with the specified toolchain, cache, and depende"
},
{
"path": ".github/workflows/enforce-pr-labels.yml",
"chars": 2208,
"preview": "name: Enforce PR labels\n\non:\n pull_request:\n types: [labeled, unlabeled, opened, edited, synchronize]\njobs:\n enforc"
},
{
"path": ".github/workflows/release.yml",
"chars": 1098,
"preview": "#! Release workflow for DataHaven Repository\n#!\n#! This workflow runs when code is merged to main, publishing Docker ima"
},
{
"path": ".github/workflows/task-build-operator.yml",
"chars": 2736,
"preview": "# Build Operator: CI for building the operator binary\n\nname: DataHaven Operator Binary Build\n\non:\n workflow_dispatch:\n "
},
{
"path": ".github/workflows/task-build-static-operator.yaml",
"chars": 1148,
"preview": "name: DataHaven Operator Static Build\n\non:\n pull_request:\n paths:\n # Only check the build if we are adding a de"
},
{
"path": ".github/workflows/task-check-licenses.yml",
"chars": 496,
"preview": "name: Check licenses\n\non:\n pull_request:\n workflow_dispatch:\n\njobs:\n verify:\n runs-on: ubuntu-latest\n permissio"
},
{
"path": ".github/workflows/task-check-metadata.yml",
"chars": 3345,
"preview": "name: \"Task: Check Metadata Freshness\"\n\non:\n workflow_dispatch:\n inputs:\n binary-hash:\n description: \"Ha"
},
{
"path": ".github/workflows/task-docker-ci.yml",
"chars": 3735,
"preview": "name: Docker Build & Publish (CI)\n\non:\n workflow_dispatch:\n inputs:\n binary-hash:\n description: \"The has"
},
{
"path": ".github/workflows/task-docker-release-validator-set-submitter.yml",
"chars": 3534,
"preview": "name: Docker Build & Publish Validator Set Submitter (Release)\n\non:\n workflow_dispatch:\n inputs:\n label:\n "
},
{
"path": ".github/workflows/task-docker-release.yml",
"chars": 5804,
"preview": "name: Docker Build & Publish (Release)\n\non:\n workflow_dispatch:\n inputs:\n label:\n description: \"Label fo"
},
{
"path": ".github/workflows/task-e2e.yml",
"chars": 5182,
"preview": "# End-To-End Tests: CI for starting a full ETH private network, deploying AVS and running tests.\n#\n# Overview:\n# 1. Star"
},
{
"path": ".github/workflows/task-foundry-tests.yml",
"chars": 930,
"preview": "# Foundry Tests: CI for Foundry components (smart contracts for EigenLayer and Snowbridge interaction)\n#\n# Overview:\n# 1"
},
{
"path": ".github/workflows/task-moonwall-tests.yml",
"chars": 2187,
"preview": "name: Moonwall Tests\n\non:\n workflow_dispatch:\n workflow_call:\n inputs:\n binary-hash:\n description: \"Has"
},
{
"path": ".github/workflows/task-publish-binary.yml",
"chars": 5241,
"preview": "name: Publish Binary Draft\n\n# The code (like generate-release-body) will be taken from the tag version, not master\non:\n "
},
{
"path": ".github/workflows/task-publish-runtime.yml",
"chars": 8193,
"preview": "name: Publish Runtime Draft\n\n# The code (like generate-release-body) will be taken from the tag versions, not master\non:"
},
{
"path": ".github/workflows/task-rust-lint.yml",
"chars": 3168,
"preview": "# Lint and Format: CI for Rust components (DataHaven runtime and node Rust tests)\n#\n# Overview:\n# 1. Check Rust Format: "
},
{
"path": ".github/workflows/task-rust-tests.yml",
"chars": 1008,
"preview": "# Rust Tests: CI for Rust components (DataHaven runtime and node Rust tests)\n\nname: DataHaven Operator Rust Tests\n\non:\n "
},
{
"path": ".github/workflows/task-storage-layout.yml",
"chars": 1242,
"preview": "# Storage Layout Check: Validates storage layout for upgradeable contracts\n#\n# Overview:\n# 1. Compares current storage l"
},
{
"path": ".github/workflows/task-ts-build.yml",
"chars": 1374,
"preview": "name: TS Build\n\non:\n workflow_dispatch:\n workflow_call:\n\n# Explicit minimal permissions\npermissions:\n contents: read\n"
},
{
"path": ".github/workflows/task-ts-lint.yml",
"chars": 1312,
"preview": "name: TS Lint & Format\n\non:\n workflow_dispatch:\n workflow_call:\n\n# Explicit minimal permissions\npermissions:\n content"
},
{
"path": ".github/workflows/task-warm-sccache.yml",
"chars": 1703,
"preview": "# Warm sccache: Pre-populate the sccache cache for downstream Rust jobs\n#\n# This job runs first and compiles the project"
},
{
"path": ".github/workflows/weekly-audit.yml",
"chars": 608,
"preview": "# Rust Audit: CI for Rust audit of the operator node\n#\n# Overview:\n# 1. Check all the dependencies from Cargo.lock for r"
},
{
"path": ".gitignore",
"chars": 492,
"preview": "# Generated by Cargo\n# will have compiled files and executables\ndebug/\ntarget/\n\n# These are backup files generated by ru"
},
{
"path": ".gitmodules",
"chars": 389,
"preview": "[submodule \"contracts/lib/forge-std\"]\n\tpath = contracts/lib/forge-std\n\turl = https://github.com/foundry-rs/forge-std\n[su"
},
{
"path": "CLAUDE.md",
"chars": 5613,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 15287,
"preview": "# DataHaven 🫎\n\nAI-First Decentralized Storage secured by EigenLayer — a verifiable storage network for AI training data,"
},
{
"path": "biome.json",
"chars": 1904,
"preview": "{\n \"$schema\": \"https://biomejs.dev/schemas/2.0.0-beta.5/schema.json\",\n \"files\": {\n \"includes\": [\n \"**/*.js\",\n "
},
{
"path": "contracts/.gitignore",
"chars": 202,
"preview": "# Compiler files\ncache/\nout/\n\n# Ignores development broadcast logs (autogenerated by forge script --broadcast)\nbroadcast"
},
{
"path": "contracts/README.md",
"chars": 2988,
"preview": "# DataHaven AVS Smart Contracts\n\nImplements the Actively Validated Service (AVS) logic for DataHaven, secured by EigenLa"
},
{
"path": "contracts/VERSION",
"chars": 7,
"preview": "0.20.0\n"
},
{
"path": "contracts/config/anvil.json",
"chars": 1916,
"preview": "{\n \"eigenLayer\": {\n \"pausers\": [\n \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n \"0x70997970C51812dc3A010C"
},
{
"path": "contracts/config/example.jsonc",
"chars": 8290,
"preview": "//! REMOVE ALL COMMENTS AND CHANGE EXTENSION TO `.json` BEFORE USING\n//! Parsing JSONC is not supported by the Solidity "
},
{
"path": "contracts/config/mainnet-ethereum.json",
"chars": 2137,
"preview": "{\n \"eigenLayer\": {\n \"pausers\": [],\n \"unpauser\": \"0x0000000000000000000000000000000000000000\",\n \"rewardsUpdater"
},
{
"path": "contracts/config/stagenet-hoodi.json",
"chars": 2759,
"preview": "{\n \"eigenLayer\": {\n \"pausers\": [\n \"0x64D78399B0fa32EA72959f33edCF313159F3c13D\"\n ],\n \"unpauser\": \"0xE3328c"
},
{
"path": "contracts/config/testnet-hoodi.json",
"chars": 3215,
"preview": "{\n \"eigenLayer\": {\n \"pausers\": [\n \"0x64D78399B0fa32EA72959f33edCF313159F3c13D\"\n ],\n \"unpauser\": \"0xE3328c"
},
{
"path": "contracts/deployments/anvil-agent-info.json",
"chars": 139,
"preview": "{\"Agent\": \"0xac06641381166cf085281c45292147f833C622d7\",\"AgentOrigin\": \"0x00000000000000000000000000000000000000000000000"
},
{
"path": "contracts/deployments/anvil-rewards-info.json",
"chars": 146,
"preview": "{\"RewardsAgent\": \"0xac06641381166cf085281c45292147f833C622d7\",\"AgentOrigin\": \"0x0000000000000000000000000000000000000000"
},
{
"path": "contracts/deployments/anvil.json",
"chars": 1481,
"preview": "{\n \"network\": \"anvil\",\n \"BeefyClient\": \"0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf\",\n \"AgentExecutor\": \"0x0E801"
},
{
"path": "contracts/deployments/hoodi.json",
"chars": 832,
"preview": "{\n \"network\": \"hoodi\",\n \"BeefyClient\": \"0x109F9D0064D68639552d9aE037D67186EC870a1f\",\n \"AgentExecutor\": \"0xfd44dC7B88d"
},
{
"path": "contracts/deployments/metadata.json",
"chars": 648,
"preview": "{\n \"name\": \"DataHaven\",\n \"website\": \"https://datahaven.xyz/\",\n \"description\": \"DataHaven is a decentralized, Ei"
},
{
"path": "contracts/deployments/stagenet-hoodi-rewards-info.json",
"chars": 146,
"preview": "{\"RewardsAgent\": \"0x2E039a88838241d1Ac738cf2e3C5763ba12571e7\",\"AgentOrigin\": \"0x56490bd3f367447bfaf57bb18e7a45e1b2db7d53"
},
{
"path": "contracts/deployments/stagenet-hoodi.json",
"chars": 903,
"preview": "{\n \"network\": \"stagenet-hoodi\",\n \"BeefyClient\": \"0xE65dc4eCA2Fd428361076e1f204731224CeB4292\",\n \"AgentExecutor\": \"0x35"
},
{
"path": "contracts/deployments/state-diff.checksum",
"chars": 40,
"preview": "d7d30510de741750e5b2069228eb2b037f20cc22"
},
{
"path": "contracts/deployments/state-diff.json",
"chars": 558449,
"preview": "{\n \"24\": {\n \"address\": \"0x0000BBdDc7CE488642fb579F8B00f3a590007251\",\n \"code\": \"0x3373ffffffffffffffffffffffffffff"
},
{
"path": "contracts/foundry.toml",
"chars": 5041,
"preview": "[profile.default]\n # Project Configuration\n\n # Path to contract sources relative to the root of the project.\n s"
},
{
"path": "contracts/script/deploy/Config.sol",
"chars": 1903,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\ncontract Config {\n // Snowbridge parameters\n stru"
},
{
"path": "contracts/script/deploy/DeployBase.s.sol",
"chars": 14429,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// Testing imports\nimport {Script} from \"forge-std/Scri"
},
{
"path": "contracts/script/deploy/DeployImplementation.s.sol",
"chars": 4117,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {Script} from \"forge-std/Script.sol\";\nimport {co"
},
{
"path": "contracts/script/deploy/DeployLive.s.sol",
"chars": 11644,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {DeployBase, ServiceManagerInitParams} from \"./D"
},
{
"path": "contracts/script/deploy/DeployLocal.s.sol",
"chars": 29220,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {DeployBase, StrategyInfo, ServiceManagerInitPar"
},
{
"path": "contracts/script/deploy/DeployParams.s.sol",
"chars": 12237,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {EmptyContract} from \"eigenlayer-contracts/src/t"
},
{
"path": "contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol",
"chars": 1185,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\nimport {OwnableUpgradeable} from \"@openzeppelin-upgrades/c"
},
{
"path": "contracts/script/transact/AllocateOperatorStake.s.sol",
"chars": 2434,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// EigenLayer imports\nimport {\n IAllocationManagerTy"
},
{
"path": "contracts/script/transact/SignUpOperatorBase.s.sol",
"chars": 6963,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// EigenLayer imports\nimport {\n IAllocationManagerTy"
},
{
"path": "contracts/script/transact/SignUpValidator.s.sol",
"chars": 855,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {SignUpOperatorBase} from \"./SignUpOperatorBase."
},
{
"path": "contracts/script/utils/Accounts.sol",
"chars": 1787,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {Script} from \"forge-std/Script.sol\";\n\ncontract "
},
{
"path": "contracts/script/utils/DHScriptStorage.s.sol",
"chars": 974,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// Testing imports\nimport {Script} from \"forge-std/Scri"
},
{
"path": "contracts/script/utils/ELScriptStorage.s.sol",
"chars": 4235,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// Testing imports\nimport {Script} from \"forge-std/Scri"
},
{
"path": "contracts/script/utils/Logging.sol",
"chars": 2151,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {console} from \"forge-std/console.sol\";\n\nlibrary"
},
{
"path": "contracts/script/utils/SnowbridgeScriptStorage.s.sol",
"chars": 1470,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n// Testing imports\nimport {Script} from \"forge-std/Scri"
},
{
"path": "contracts/script/utils/ValidatorsUtils.sol",
"chars": 823,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {MerkleUtils} from \"../../src/libraries/MerkleUt"
},
{
"path": "contracts/scripts/check-storage-layout-negative.sh",
"chars": 945,
"preview": "#!/bin/bash\nset -euo pipefail\n\n# Negative check: ensure the snapshot-diff storage layout script fails when the layout is"
},
{
"path": "contracts/scripts/check-storage-layout.sh",
"chars": 3161,
"preview": "#!/bin/bash\nset -e\n\n# Storage Layout Check Script\n# Compares current storage layout against committed snapshot to detect"
},
{
"path": "contracts/src/DataHavenServiceManager.sol",
"chars": 28477,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\n// OpenZeppelin imports\nimport {OwnableUpgradeable} from \""
},
{
"path": "contracts/src/interfaces/IDataHavenServiceManager.sol",
"chars": 17147,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\n// EigenLayer imports\nimport {IStrategy} from \"eigenlayer-"
},
{
"path": "contracts/src/libraries/DataHavenSnowbridgeMessages.sol",
"chars": 2395,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\n// Snowbridge imports\nimport {ScaleCodec} from \"snowbridge"
},
{
"path": "contracts/src/libraries/MerkleUtils.sol",
"chars": 7955,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\n/**\n * @title MerkleUtils\n * @notice Utility functions for"
},
{
"path": "contracts/storage-snapshots/DataHavenServiceManager.storage.json",
"chars": 5222,
"preview": "{\n \"storage\": [\n {\n \"astId\": 138,\n \"contract\": \"src/DataHavenServiceManager.sol:DataHavenServiceManager\",\n"
},
{
"path": "contracts/storage-snapshots/README.md",
"chars": 3118,
"preview": "# Storage Layout Snapshots\n\nThis directory contains storage layout snapshots for upgradeable contracts. These snapshots "
},
{
"path": "contracts/test/MessageEncoding.t.sol",
"chars": 1249,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {consol"
},
{
"path": "contracts/test/OperatorAddressMappings.t.sol",
"chars": 6868,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {AVSDeployer} from \"./utils/AVSDeployer.sol\";\nim"
},
{
"path": "contracts/test/RewardsSubmitter.t.sol",
"chars": 19604,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\n/* solhint-disable func-name-mixedcase */\n\nimport {IERC"
},
{
"path": "contracts/test/Slashing.t.sol",
"chars": 6905,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {AVSDeployer} from \"./utils/AVSDeployer.sol\";\nim"
},
{
"path": "contracts/test/SnowbridgeIntegration.t.sol",
"chars": 2725,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\n/* solhint-disable func-name-mixedcase */\n\nimport {IGat"
},
{
"path": "contracts/test/ValidatorSetSelection.t.sol",
"chars": 21926,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\n/* solhint-disable func-name-mixedcase */\n\nimport {Snow"
},
{
"path": "contracts/test/ValidatorSetSubmitter.t.sol",
"chars": 11575,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\n/* solhint-disable func-name-mixedcase */\n\nimport {Snow"
},
{
"path": "contracts/test/mocks/PermissionControllerMock.sol",
"chars": 2668,
"preview": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.27;\n\nimport {\n IPermissionController\n} from \"eigenlayer-con"
},
{
"path": "contracts/test/mocks/RewardsCoordinatorMock.sol",
"chars": 5253,
"preview": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.27;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20"
},
{
"path": "contracts/test/mocks/SnowbridgeGatewayMock.sol",
"chars": 1444,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {IGatewayV2} from \"snowbridge/src/v2/IGateway.so"
},
{
"path": "contracts/test/storage/StorageLayout.t.sol",
"chars": 7832,
"preview": "// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.27;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {\n ITra"
},
{
"path": "contracts/test/utils/AVSDeployer.sol",
"chars": 16753,
"preview": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.27;\n\nimport {ProxyAdmin} from \"@openzeppelin/contracts/proxy/t"
},
{
"path": "contracts/test/utils/ERC20FixedSupply.sol",
"chars": 510,
"preview": "// SPDX-License-Identifier: MIT\n// Compatible with OpenZeppelin Contracts ^5.0.0\npragma solidity ^0.8.22;\n\nimport {ERC20"
},
{
"path": "contracts/test/utils/SnowbridgeAndAVSDeployer.sol",
"chars": 12231,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC"
},
{
"path": "contracts/test/utils/TestUtils.sol",
"chars": 2276,
"preview": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.27;\n\nimport {SafeCast} from \"@openzeppelin/contracts/utils/m"
},
{
"path": "deploy/README.md",
"chars": 4353,
"preview": "# DataHaven Deployment\n\nThis directory contains Helm charts and configurations for deploying DataHaven nodes and relayer"
},
{
"path": "deploy/chainspecs/dh-testnet-spec-base.json",
"chars": 2673646,
"preview": "{\n \"name\": \"DataHaven Testnet\",\n \"id\": \"datahaven_testnet\",\n \"chainType\": \"Live\",\n \"bootNodes\": [],\n \"telemetryEndp"
},
{
"path": "deploy/chainspecs/dh-testnet-spec-raw.json",
"chars": 2694398,
"preview": "{\n \"name\": \"DataHaven Testnet\",\n \"id\": \"datahaven_testnet\",\n \"chainType\": \"Live\",\n \"bootNodes\": [\n \"/ip4/dh-bootn"
},
{
"path": "deploy/charts/backend/Chart.yaml",
"chars": 209,
"preview": "apiVersion: v2\nname: sh-mspbackend\ndescription: A Helm chart for StorageHub MSP Backend API\ntype: application\nversion: 0"
},
{
"path": "deploy/charts/backend/README.md",
"chars": 6568,
"preview": "# StorageHub MSP Backend Helm Chart\n\nThis Helm chart deploys the StorageHub MSP Backend API service that provides REST A"
},
{
"path": "deploy/charts/backend/storagehub/sh-mspbackend.yaml",
"chars": 1284,
"preview": "# StorageHub MSP Backend API base configuration\n# This file contains the base configuration for the StorageHub MSP Backe"
},
{
"path": "deploy/charts/backend/templates/_helpers.tpl",
"chars": 1607,
"preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"backend.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | tru"
},
{
"path": "deploy/charts/backend/templates/configmap.yaml",
"chars": 1612,
"preview": "{{- if .Values.configMap.enabled -}}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: {{ include \"backend.fullname\" . }}"
},
{
"path": "deploy/charts/backend/templates/deployment.yaml",
"chars": 2646,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: {{ include \"backend.fullname\" . }}\n labels:\n {{- include \"bac"
},
{
"path": "deploy/charts/backend/templates/ingress.yaml",
"chars": 2078,
"preview": "{{- if .Values.ingress.enabled -}}\n{{- $fullName := include \"backend.fullname\" . -}}\n{{- $svcPort := .Values.service.por"
},
{
"path": "deploy/charts/backend/templates/secret.yaml",
"chars": 321,
"preview": "{{- if .Values.secrets.enabled -}}\napiVersion: v1\nkind: Secret\nmetadata:\n name: {{ include \"backend.fullname\" . }}-cust"
},
{
"path": "deploy/charts/backend/templates/service.yaml",
"chars": 608,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: {{ include \"backend.fullname\" . }}\n labels:\n {{- include \"backend.lab"
},
{
"path": "deploy/charts/backend/templates/serviceaccount.yaml",
"chars": 319,
"preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: {{ include \"backend.servi"
},
{
"path": "deploy/charts/backend/values.yaml",
"chars": 2228,
"preview": "# Default values for backend.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\n\nre"
},
{
"path": "deploy/charts/node/.gitignore",
"chars": 14,
"preview": "ci/**/charts/\n"
},
{
"path": "deploy/charts/node/.helmignore",
"chars": 40,
"preview": "/ci\n/examples\n/scripts\nREADME.md.gotmpl\n"
},
{
"path": "deploy/charts/node/Chart.yaml",
"chars": 229,
"preview": "apiVersion: v2\ndescription: A Helm chart to deploy Substrate/Polkadot nodes\nmaintainers:\n- email: devops+helm@parity.io\n"
},
{
"path": "deploy/charts/node/README.md",
"chars": 54603,
"preview": "<!--\nDO NOT EDIT README.md manually!\nWe're using [helm-docs](https://github.com/norwoodj/helm-docs) to render values of "
},
{
"path": "deploy/charts/node/datahaven/dh-bootnode.yaml",
"chars": 2968,
"preview": "name: dh-bootnode\ndescription: Datahaven Bootnode\nfullnameOverride: dh-bootnode\n\nimage:\n repository: datahavenxyz/datah"
},
{
"path": "deploy/charts/node/datahaven/dh-validator.yaml",
"chars": 2920,
"preview": "name: dh-validator\ndescription: Datahaven Validator node\nfullnameOverride: dh-validator\n\nimage:\n repository: datahavenx"
},
{
"path": "deploy/charts/node/storagehub/sh-bspnode.yaml",
"chars": 1331,
"preview": "name: sh-bspnode\ndescription: Datahaven BSP node\nfullnameOverride: sh-bspnode\n\nimage:\n repository: datahavenxyz/datahav"
},
{
"path": "deploy/charts/node/storagehub/sh-fisherman.yaml",
"chars": 1299,
"preview": "name: sh-fisherman\ndescription: Datahaven Fisherman node\nfullnameOverride: sh-fisherman\n\nimage:\n repository: datahavenx"
},
{
"path": "deploy/charts/node/storagehub/sh-idxnode.yaml",
"chars": 884,
"preview": "name: sh-idxnode\ndescription: Datahaven Indexer node\nfullnameOverride: sh-idxnode\n\nimage:\n repository: datahavenxyz/dat"
},
{
"path": "deploy/charts/node/storagehub/sh-mspnode.yaml",
"chars": 1467,
"preview": "name: sh-mspnode\ndescription: Datahaven MSP node\nfullnameOverride: sh-mspnode\n\nimage:\n repository: datahavenxyz/datahav"
},
{
"path": "deploy/charts/node/templates/_helpers.tpl",
"chars": 5256,
"preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"node.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc "
},
{
"path": "deploy/charts/node/templates/customChainspecConfigmap.yaml",
"chars": 310,
"preview": "{{- if .Values.customChainspecContent }}\n{{- $fullname := include \"node.fullname\" . }}\napiVersion: v1\nkind: ConfigMap\nme"
},
{
"path": "deploy/charts/node/templates/customNodeKeySecret.yaml",
"chars": 1164,
"preview": "{{ $fullname := include \"node.fullname\" . }}\n{{ if .Values.node.persistGeneratedNodeKey }}\n{{ else if .Values.node.cust"
},
{
"path": "deploy/charts/node/templates/hpa.yaml",
"chars": 980,
"preview": "{{ $fullname := include \"node.fullname\" . }}\n{{- if .Values.autoscaling.enabled }}\napiVersion: autoscaling/v2\nkind: Hor"
},
{
"path": "deploy/charts/node/templates/ingress-per-replica.yaml",
"chars": 1567,
"preview": "{{- if and .Values.ingress.enabled .Values.ingress.perReplica -}}\n{{- $fullName := include \"node.fullname\" . -}}\n{{- $re"
},
{
"path": "deploy/charts/node/templates/ingress.yaml",
"chars": 1259,
"preview": "{{- if and .Values.ingress.enabled (not .Values.ingress.perReplica) -}}\n {{- $fullName := include \"node.fullname\" . -}}"
},
{
"path": "deploy/charts/node/templates/keys.yaml",
"chars": 271,
"preview": "{{ $fullname := include \"node.fullname\" . }}\n{{- range $keys := .Values.node.keys }}\n---\napiVersion: v1\nkind: Secret\nme"
},
{
"path": "deploy/charts/node/templates/podDisruptionBudget.yaml",
"chars": 735,
"preview": "\n{{ $fullname := include \"node.fullname\" . }}\n{{ $selectorLabels := include \"node.selectorLabels\" . }}\n{{ $serviceLabe"
},
{
"path": "deploy/charts/node/templates/service.yaml",
"chars": 9851,
"preview": "{{ $fullname := include \"node.fullname\" . }}\n{{ $selectorLabels := include \"node.selectorLabels\" . }}\n{{ $serviceLabe"
},
{
"path": "deploy/charts/node/templates/serviceAccount.yaml",
"chars": 1115,
"preview": "{{ $serviceAccountName := include \"node.serviceAccountName\" . }}\n{{- if .Values.serviceAccount.create -}}\napiVersion: v"
},
{
"path": "deploy/charts/node/templates/serviceMonitor.yaml",
"chars": 2711,
"preview": "{{- if .Values.node.serviceMonitor.enabled }}\n{{ $fullname := include \"node.fullname\" . }}\n{{ $serviceLabels := includ"
},
{
"path": "deploy/charts/node/templates/statefulset.yaml",
"chars": 62641,
"preview": "{{ $fullname := include \"node.fullname\" . }}\n{{ $selectorLabels := include \"node.selectorLabels\" . }}\n{{ $serviceLabel"
},
{
"path": "deploy/charts/node/values.yaml",
"chars": 28327,
"preview": "# -- Provide a name in place of node for `app:` labels\nnameOverride: \"\"\n\n# -- Provide a name to substitute for the full "
},
{
"path": "deploy/charts/relay/.helmignore",
"chars": 370,
"preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
},
{
"path": "deploy/charts/relay/Chart.yaml",
"chars": 234,
"preview": "apiVersion: v2\ndescription: A Helm chart for bridges-common-relay\nmaintainers:\n- email: devops+helm@parity.io\n name: Pa"
},
{
"path": "deploy/charts/relay/README.md",
"chars": 5292,
"preview": "<!--\nDO NOT EDIT README.md manually!\nWe're using [helm-docs](https://github.com/norwoodj/helm-docs) to render values of "
},
{
"path": "deploy/charts/relay/configs/beacon-relay.json",
"chars": 792,
"preview": "{\n \"source\": {\n \"beacon\": {\n \"endpoint\": \"http://cl-1-lodestar-reth:4000\",\n \"stateEndpoi"
},
{
"path": "deploy/charts/relay/configs/beefy-relay.json",
"chars": 674,
"preview": "{\n \"source\": {\n \"polkadot\": {\n \"endpoint\": \"ws://dh-bootnode-0:9944\"\n }\n },\n \"sink\": {"
},
{
"path": "deploy/charts/relay/configs/execution-relay.json",
"chars": 1086,
"preview": "{\n \"source\": {\n \"ethereum\": {\n \"endpoint\": \"ws://el-1-reth-lodestar:8546\"\n },\n \"contr"
},
{
"path": "deploy/charts/relay/configs/solochain-relay.json",
"chars": 1374,
"preview": "{\n \"source\": {\n \"ethereum\": {\n \"endpoint\": \"ws://el-1-reth-lodestar:8546\"\n },\n \"soloc"
},
{
"path": "deploy/charts/relay/snowbridge/dh-beacon-relay.yaml",
"chars": 572,
"preview": "name: dh-beacon-relay\ndescription: Datahaven Beacon Relay\nfullnameOverride: dh-beacon-relay\n\nimage:\n repository: dataha"
},
{
"path": "deploy/charts/relay/snowbridge/dh-beefy-relay.yaml",
"chars": 511,
"preview": "name: dh-beefy-relay\ndescription: Datahaven Beefy Relay\nfullnameOverride: dh-beefy-relay\n\nimage:\n repository: datahaven"
},
{
"path": "deploy/charts/relay/snowbridge/dh-execution-relay.yaml",
"chars": 580,
"preview": "name: dh-execution-relay\ndescription: Datahaven Execution Relay\nfullnameOverride: dh-execution-relay\n\nimage:\n repositor"
},
{
"path": "deploy/charts/relay/snowbridge/dh-solochain-relay.yaml",
"chars": 678,
"preview": "name: dh-solochain-relay\ndescription: Datahaven Solochain Relay\nfullnameOverride: dh-solochain-relay\n\nimage:\n repositor"
},
{
"path": "deploy/charts/relay/templates/_helpers.tpl",
"chars": 2235,
"preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"bridges-common-relay.name\" -}}\n{{- default .Chart.Name .Values.nameO"
},
{
"path": "deploy/charts/relay/templates/configmap.yaml",
"chars": 330,
"preview": "{{- if .Values.config }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: {{ include \"bridges-common-relay.fullname\" . }"
},
{
"path": "deploy/charts/relay/templates/cronjob.yml",
"chars": 3436,
"preview": "{{ range $val := .Values.rewards }}\n{{ range $reward_owner := tuple \"ThisChain\" \"BridgedChain\" }}\napiVersion: batch/v1\nk"
},
{
"path": "deploy/charts/relay/templates/deployment.yaml",
"chars": 3990,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: {{ include \"bridges-common-relay.fullname\" . }}\n labels:\n {{-"
},
{
"path": "deploy/charts/relay/templates/pvc.yaml",
"chars": 606,
"preview": "{{- if and .Values.relayData.storagePath .Values.relayData.volumeSize }}\napiVersion: v1\nkind: PersistentVolumeClaim\nmeta"
},
{
"path": "deploy/charts/relay/templates/secret.yaml",
"chars": 312,
"preview": "{{- if .Values.secrets }}\napiVersion: v1\nkind: Secret\nmetadata:\n name: {{ include \"bridges-common-relay.fullname\" . }}\n"
},
{
"path": "deploy/charts/relay/templates/service.yaml",
"chars": 479,
"preview": "{{- if .Values.prometheus.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n name: {{ include \"bridges-common-relay.ful"
},
{
"path": "deploy/charts/relay/templates/serviceaccount.yaml",
"chars": 346,
"preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: {{ include \"bridges-commo"
},
{
"path": "deploy/charts/relay/templates/servicemonitor.yaml",
"chars": 1001,
"preview": "{{- if and .Values.serviceMonitor.enabled .Values.prometheus.enabled }}\n---\napiVersion: monitoring.coreos.com/v1\nkind: S"
},
{
"path": "deploy/charts/relay/values.yaml",
"chars": 4043,
"preview": "# -- Number of replicas for the pod\n\nreplicaCount: 1\n\nimage:\n # -- Image repository\n repository: paritytech/substrate-"
},
{
"path": "deploy/environments/local/dh-beacon-relay.yaml",
"chars": 256,
"preview": "# Beacon relay-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nim"
},
{
"path": "deploy/environments/local/dh-beefy-relay.yaml",
"chars": 164,
"preview": "# Beefy relay-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nima"
},
{
"path": "deploy/environments/local/dh-bootnode.yaml",
"chars": 833,
"preview": "# Bootnode-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage:"
},
{
"path": "deploy/environments/local/dh-execution-relay.yaml",
"chars": 259,
"preview": "# Execution relay-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n"
},
{
"path": "deploy/environments/local/dh-solochain-relay.yaml",
"chars": 259,
"preview": "# Solochain relay-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n"
},
{
"path": "deploy/environments/local/dh-validator.yaml",
"chars": 958,
"preview": "# Validator-specific settings for local development\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage"
},
{
"path": "deploy/environments/local/sh-bspnode.yaml",
"chars": 871,
"preview": "# BSP-specific settings for Local environment\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage:\n ta"
},
{
"path": "deploy/environments/local/sh-fisherman.yaml",
"chars": 881,
"preview": "# Fisherman-specific settings for Local environment\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage"
},
{
"path": "deploy/environments/local/sh-idxnode-db.yaml",
"chars": 701,
"preview": "# Install PostgreSQL into local k8S cluster\n# helm repo add bitnami https://charts.bitnami.com/bitnami\n# helm repo updat"
},
{
"path": "deploy/environments/local/sh-idxnode.yaml",
"chars": 553,
"preview": "# Indexer-specific settings for Local environment\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage:\n"
},
{
"path": "deploy/environments/local/sh-mspbackend.yaml",
"chars": 1449,
"preview": "# StorageHub MSP Backend API configuration for Local environment\n\nglobal:\n environment: local\n namespace: kt-datahaven"
},
{
"path": "deploy/environments/local/sh-mspnode.yaml",
"chars": 871,
"preview": "# MSP-specific settings for Local environment\n\nglobal:\n environment: local\n namespace: kt-datahaven-local\n\nimage:\n ta"
},
{
"path": "deploy/environments/local/traefik.yaml",
"chars": 673,
"preview": "# Install Traefik as ingress controller into local k8S cluster\n# helm repo add traefik https://traefik.github.io/charts\n"
},
{
"path": "deploy/environments/stagenet/dh-beacon-relay.yaml",
"chars": 217,
"preview": "# Beacon relay-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage"
},
{
"path": "deploy/environments/stagenet/dh-beefy-relay.yaml",
"chars": 156,
"preview": "# Beefy relay-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:"
},
{
"path": "deploy/environments/stagenet/dh-bootnode.yaml",
"chars": 1681,
"preview": "# Bootnode-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n "
},
{
"path": "deploy/environments/stagenet/dh-execution-relay.yaml",
"chars": 220,
"preview": "# Execution relay-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nim"
},
{
"path": "deploy/environments/stagenet/dh-solochain-relay.yaml",
"chars": 221,
"preview": "# Solochain relay-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nim"
},
{
"path": "deploy/environments/stagenet/dh-validator.yaml",
"chars": 1544,
"preview": "# Validator-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n "
},
{
"path": "deploy/environments/stagenet/sh-bspnode.yaml",
"chars": 1528,
"preview": "# BSP-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n tag: "
},
{
"path": "deploy/environments/stagenet/sh-fisherman.yaml",
"chars": 1544,
"preview": "# Fisherman-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n "
},
{
"path": "deploy/environments/stagenet/sh-idxnode-db.yaml",
"chars": 731,
"preview": "# Install PostgreSQL into local k8S cluster\n# helm repo add bitnami https://charts.bitnami.com/bitnami\n# helm repo updat"
},
{
"path": "deploy/environments/stagenet/sh-idxnode.yaml",
"chars": 423,
"preview": "# Indexer-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n t"
},
{
"path": "deploy/environments/stagenet/sh-mspbackend.yaml",
"chars": 2027,
"preview": "# StorageHub MSP Backend API configuration for Stagenet environment\n\nglobal:\n environment: stagenet\n namespace: dataha"
},
{
"path": "deploy/environments/stagenet/sh-mspnode.yaml",
"chars": 1528,
"preview": "# MSP-specific settings for stagenet\n\nglobal:\n environment: stagenet\n namespace: kt-datahaven-stagenet\n\nimage:\n tag: "
},
{
"path": "deploy/environments/testnet/dh-bootnode.yaml",
"chars": 601,
"preview": "# Bootnode-specific settings for testnet\n\nglobal:\n environment: testnet\n namespace: datahaven-pretestnet\n\nimage:\n tag"
},
{
"path": "deploy/environments/testnet/dh-validator.yaml",
"chars": 495,
"preview": "# Validator-specific settings for testnet\n\nglobal:\n environment: testnet\n namespace: datahaven-pretestnet\n\nimage:\n ta"
},
{
"path": "docker/datahaven-build.Dockerfile",
"chars": 1669,
"preview": "# --- Setup Build Environment ---\nFROM rust:latest AS base\n\nARG MOLD_VERSION=2.40.4\nARG PROTOC_VER=21.12\nARG SCCACHE_VE"
},
{
"path": "docker/datahaven-dev.Dockerfile",
"chars": 2370,
"preview": "# DataHaven Development/Troubleshooting Image\n#\n# This image is ONLY for local development and troubleshooting purposes."
},
{
"path": "docker/datahaven-production.Dockerfile",
"chars": 2857,
"preview": "# Production Image for DataHaven\n#\n# Requires to run from repository root and to copy the binary in the build folder (pa"
},
{
"path": "file_header.txt",
"chars": 697,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/.dockerignore",
"chars": 587,
"preview": "# Editor/IDE specific\n**/.idea/\n**/.vscode/\n**/.DS_Store\n**/*.swp\n**/*.swo\n**/*.bak\n**/*~\n\n# Temporary/cache files\n**/*."
},
{
"path": "operator/.gitignore",
"chars": 377,
"preview": "# MacOS thing\n**/.DS_Store\n\n# Rust directories\ntarget\n\n# Typescript directories\n**/node_modules\n**/.yarn\n\n# Spec/Wasm bu"
},
{
"path": "operator/Cargo.toml",
"chars": 32819,
"preview": "[workspace.package]\nauthors = [\"Moonsong Labs\"]\ndescription = \"DataHaven: A decentralized storage network with Ethereum "
},
{
"path": "operator/DOCKER-COMPOSE.md",
"chars": 11940,
"preview": "# Docker Compose Setup for DataHaven Network\n\nThis docker-compose configuration runs a local DataHaven network with:\n- *"
},
{
"path": "operator/Dockerfile",
"chars": 2343,
"preview": "# DataHaven Operator Image\n#\n# This is the standard operator image used for CI and release builds.\n# It's a minimal imag"
},
{
"path": "operator/README.md",
"chars": 5804,
"preview": "# DataHaven Operator (Substrate Node) 🫎\n\nThe DataHaven operator is a Substrate-based blockchain node that serves as an E"
},
{
"path": "operator/benchmarking/frame-weight-template.hbs",
"chars": 3559,
"preview": "{{header}}\n\n//! Autogenerated weights for `{{pallet}}`\n//!\n//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMAR"
},
{
"path": "operator/docker-compose.yml",
"chars": 11062,
"preview": "services:\n alice:\n build:\n context: .\n dockerfile: Dockerfile\n image: datahavenxyz/datahaven:local\n "
},
{
"path": "operator/node/Cargo.toml",
"chars": 7566,
"preview": "[package]\nauthors = { workspace = true }\ndescription = { workspace = true }\nedition = { workspace = true }\nhomepage = { "
},
{
"path": "operator/node/README.md",
"chars": 36,
"preview": "## Release\n\nPolkadot SDK stable2412\n"
},
{
"path": "operator/node/build.rs",
"chars": 858,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/benchmarking.rs",
"chars": 6286,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/chain_spec/mainnet.rs",
"chars": 2505,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/chain_spec/mod.rs",
"chars": 1899,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/chain_spec/stagenet.rs",
"chars": 2511,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/chain_spec/testnet.rs",
"chars": 2505,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/cli.rs",
"chars": 32583,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/client.rs",
"chars": 2973,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/command.rs",
"chars": 22229,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/config.rs",
"chars": 1760,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
},
{
"path": "operator/node/src/consensus.rs",
"chars": 1940,
"preview": "// Copyright 2025 DataHaven\n// This file is part of DataHaven.\n\n// DataHaven is free software: you can redistribute it a"
}
]
// ... and 789 more files (download for full content)
About this extraction
This page contains the full source code of the datahaven-xyz/datahaven GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 989 files (13.8 MB), approximately 3.7M tokens, and a symbol index with 8928 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.