The Ava Protocol AVS can be compiled directly using Go version 1.22+. Ensure you have the appropriate version of Go installed on your development environment.
Check Go version:
go version
Compile Ava Protocol AVS:
go build -o ap-avs
Then you can run ap-avs
binary. We make an effort to use pure Go so you can also cross compile for any supported architecture that the Go compiler support.
Check how to run an operator docs
To run the aggregator, use the following command:
ap-avs aggregator
Note: The Ava Protocol team currently manages the aggregator, and the communication IP address between the operator and the aggregator is hardcoded in the operator.
![]() |
For each owner we deploy a ERC6900 wallet to schedule task and approve spending to user wallet.
Each task type has its equivalent modular code to re-present its condition and their actual execution.
Aggregator accepts RPC request from client to submit Task Payload. Currently, aggregator is managed and run by Ava Protocol team.
Periodically, aggregator combine the task submission, update our internal storage and a zkSNARK proof will be write back to our TaskManager contract.
Aggregator also accept task condition check result from operator, perform quorum and consensus check, then write the result back and flag that a task is good to run.
The aggregator is currently run and managed by the Ava Protocol team. Depend on testnet or mainnet, you would need to point your operator to the right address in the operator config file.
- aggregator-holesky.avaprotocol.org:2206
- https://api-explorer-holesky.avaprotocol.org/
- aggregator.avaprotocol.org:2206
- https://api-explorer.avaprotocol.org/
Operators communicates with aggregators through RPC. It requests task data from aggregator, it performs condition execution to check whether a task can be trigger. The result is then sent back to aggregator.
For task is ok to run, the operator will executed them. The detail of how task is triggering through our ERC6900 modular wallet will come soon.
Currently, Ava Protocol has deployed our operator on the testnet. Community members can run their own operator and register for Ava Protocol AVS service, or they can delegate their tokens to the Ava Protocol operator.
- Ava Protocol's operator: 0x997e5d40a32c44a3d93e59fc55c4fd20b7d2d49d.
- Ava Protocol's operator: 0xc6B87cc9e85b07365b6aBEfff061F237F7cf7Dc3
Operator that is connected to Ava Protocol aggregator can also check their operator on our telemetry dashboard as below
https://aggregator-holesky.avaprotocol.org/telemetry
https://aggregator.avaprotocol.org/telemetry
View docs/development.md
The Makefile includes two primary test configurations:
# Default test suite
go test -race -buildvcs -vet=off ./...
# Verbose test output
go test -v -race -buildvcs ./...
For improved test result formatting, use gotestfmt
:
-
Install the formatter:
go install github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt@latest
-
Run once in the current terminal session to make Bash scripts more robust and error-aware.
set -euo pipefail
-
Run tests with formatted output:
Run all tests with complete output:
go test -json ./... | gotestfmt
or, run selected test cases:
go test -json -run ^TestRestRequestErrorHandling$ ./... 2>&1 | gotestfmt --hide=all
The
--hide=all
flag suppresses output for skipped and successful tests, showing only failures. For more output configuration options, see the gotestfmt documentation.
=======
# Install golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2
# Run the linter
golangci-lint run ./...
# Or use the Makefile target
make audit
- Run linters before committing code to catch issues early
- Configure your IDE to run linters on save for immediate feedback
- Include linting in CI/CD pipelines to enforce code quality standards
- Fix linting issues as they arise rather than letting them accumulate
When you modify any .proto
files (primarily protobuf/avs.proto
or protobuf/node.proto
), you need to regenerate the corresponding Go bindings.
-
Install
protoc
(the protobuf compiler): If you don't have it, download it from the protobuf releases page and ensure it's in your system'sPATH
. -
Install Go plugins for
protoc
: These commands will install the necessary Go code generators for protobuf messages and gRPC services. Ensure your$GOPATH/bin
or$HOME/go/bin
is in your systemPATH
.go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
After installing the prerequisites, run the following Make target from the project root:
make protoc-gen
- Proto source files: Reside in the
protobuf/
directory (e.g.,protobuf/avs.proto
,protobuf/node.proto
). go_package
option: Bothavs.proto
andnode.proto
useoption go_package = "github.com/AvaProtocol/EigenLayer-AVS/protobuf;avsproto";
.- This directs
protoc-gen-go
to generate files that will be part of the Go package aliased asavsproto
. - The import path for this package in your Go code will be
github.com/AvaProtocol/EigenLayer-AVS/protobuf
(assuminggithub.com/AvaProtocol/EigenLayer-AVS
is your module name fromgo.mod
).
- This directs
- Generated Go files: The
make protoc-gen
command is configured (via--go_out=.
and thego_package
option) to place the generated*.pb.go
and*_grpc.pb.go
files directly into theprotobuf/
directory.- Example:
protobuf/avs.pb.go
,protobuf/node.pb.go
. - All these generated files will contain the Go package declaration:
package avsproto
.
- Example:
To use the generated types and gRPC clients/servers in your Go code, import the package as follows:
import (
// ... other imports
avspb "github.com/AvaProtocol/EigenLayer-AVS/protobuf" // Use a suitable alias like avspb
)
func main() {
req := &avspb.IdReq{Id: "test-id"}
// ... use other types like avspb.Task, avspb.AggregatorClient, etc.
}
Important: If you change the go_package
option in the .proto
files or the output paths in the Makefile
, you will likely need to update the import paths in your Go codebase accordingly.
Coming soon
Name | Address |
---|---|
ProxyAdmin | 0x26CF7A7DF7d1E00D83A5Ca24385f697a3ca4577d |
ServiceManager | 0xEA3E82F9Ae371A6a372A6DCffB1a9bD17e0608eF |
RegistryCoordinator | 0x90c6d6f2A78d5Ce22AB8631Ddb142C03AC87De7a |
BLSApkRegistry | 0x6752F8BeeE5BF45c9d11FDBC4F8aFfF879925585 |
IndexRegistry | 0x298a5d3C8F8Db30E8292C9e2BF92292de469C8FF |
OperatorStateRetriever | 0xb7bb920538e038DFFEfcB55caBf713652ED2031F |
PauserRegistry | 0x3A8ea6e4202CdDe4a9e0cCE19c4Dc1739ba2cF0b |
StakeRegistry | 0x7BacD5dd5A7C3acf8bf1a3c88fB0D00B68EE626A |
ApConfig | 0xb8abbb082ecaae8d1cd68378cf3b060f6f0e07eb |
Name | Address |
---|---|
ProxyAdmin | 0x5989934D31f7f397511f105B7E4175a06B7A517F |
ServiceManager | 0x18343Aa10e3D2F3A861e5649627324aEAD987Adf |
RegistryCoordinator | 0x8DE3Ee0dE880161Aa0CD8Bf9F8F6a7AfEeB9A44B |
BLSApkRegistry | 0xB58687fF303C8e92C28a484342755d3228081d45 |
IndexRegistry | 0xc6A464e39d4fA5013D61295501c7cCd050d76612 |
OperatorStateRetriever | 0xb3af70D5f72C04D1f490ff49e5aB189fA7122713 |
PauserRegistry | 0xeec585186c37c517030ba371deac5c17e728c135 |
StakeRegistry | 0x363b3604fE8c2323a98c00906115c8b87a512a12 |
TaskManager | 0x940f62f75cbbbd723d37c9171dc681dfba653b49 |
ApConfig | 0x9c02dfc92eea988902a98919bf4f035e4aaefced |