---
# System prepended metadata

title: EPF Cohort 3 Dev Update 9 (pavignol)

---

# EPF Cohort 3 Dev Update 9 (pavignol)

I didn't post an update last week because I hadn't made much progress on the EPF front and was I busy working on a client for the KZG Ceremony. This week, I have 2 updates:

## Added a REST implementation for the `GetDuties` endpoint

`GetDuties` is an endpoint that I started working on weeks ago, but because there was a bug with the prysm beacon node REST API, I was unable to complete it. Now that the bug has been fixed, I was finally able to merge this PR.

The `GetDuties` endpoint aggregates 8 Beacon REST APIs into a single one:

1 call to `/eth/v1/validator/duties/attester/{epoch}`
1 call to `/eth/v1/validator/duties/attester/{epoch+1}`
1 call to `/eth/v1/validator/duties/proposer/{epoch}`
1 call to `/eth/v1/validator/duties/proposer/{epoch+1}`
1 call to `/eth/v1/validator/duties/proposer/{sync}`
1 call to `/eth/v1/validator/duties/proposer/{sync+1}`
1 call to `/eth/v1/beacon/states/head/committees?{epoch}`
1 call to `/eth/v1/beacon/states/head/committees?{epoch+1}`

Once all the calls are made, aggregating the information is relatively straightforward. The way the information is presented in the REST API is different from how it is presented in the gRPC API, but with a few hashmaps it's pretty simple to reconstruct it. Because of the high number of Beacon API calls, the tests were the biggest chunk of this work since there are many edge cases are validation cases to test.

## Made a C++ KZG Ceremony Client

This task is unrelated to the EPF, but I was interested in building a client for the KZG Ceremony and use this client to send my own contribution. The client is now mostly done and has the following features:

- Supports Windows, Mac and a wide range of Linux distributions
- Supports Ethereum and GitHub accounts
- BLS signing
- ECDSA signing for Ethereum accounts
- Transcript verification
- Contribution verification
- Lightweight (the executable is around 3MB)

For the sake of language and framework diversity, I decided to build the client with C++. Current implementations are centered around Go, Rust or JavaScript, so it adds some diversity to the list of clients that people can use.

## Update on the PRs

There are only 5 endpoints remaining! We've come a long way from the start of this project and it's really nice to see that we're probably going to be able to 100% complete this project. 2 of the remaining tasks are on me, and now that my KZG Ceremony client implementation is done, I'll be able to focus more time in the next 2 weeks on those. I think they will also be relatively easy to implement since they are the stream versions of endpoints that have already been implemented (e.g. `GetDuties -> StreamDuties`).

Legend:
|Symbol             | State                 |
|-------------------|-----------------------|
|:x:                | Not ready for PR      |
|:o:                | PR opened             |
|:heavy_check_mark: | Merged into `develop` |

| Done               | Owner    | Endpoint                            |
|--------------------|----------|-------------------------------------|
| :heavy_check_mark: | pavignol | GetDuties                           |
| :heavy_check_mark: | pavignol | GetBeaconBlock                      |
| :heavy_check_mark: | pavignol | ProposeBeaconBlock                  |
| :heavy_check_mark: | pavignol | PrepareBeaconProposer               |
| :heavy_check_mark: | pavignol | GetAttestationData                  |
| :heavy_check_mark: | dhruv    | ProposeAttestation                  |
| :heavy_check_mark: | dhruv    | SubmitAggregateSelectionProof       |
| :x:                | dhruv    | SubmitSignedAggregateSelectionProof |
| :heavy_check_mark: | pavignol | ProposeExit                         |
| :heavy_check_mark: | pavignol | SubscribeCommitteeSubnets           |
| :heavy_check_mark: |   manu   |   SubmitValidatorRegistrations      |
| :heavy_check_mark: | manu     | ValidatorIndex                      |
| :heavy_check_mark: | manu     | ValidatorStatus                     |
| :heavy_check_mark: |   manu   |   MultipleValidatorStatus           |
| :heavy_check_mark: | pavignol | SubmitSignedContributionAndProof    |
| :heavy_check_mark: | manu     | SubmitSyncMessage                   |
| :x:                | dhruv    | GetSyncSubcommitteeIndex            |
| :heavy_check_mark: | dhruv    | GetSyncMessageBlockRoot             |
| :x:                | pavignol | StreamDuties                        |
| :heavy_check_mark: | pavignol | WaitForChainStart                   |
| :heavy_check_mark: | manu     | WaitForActivation                   |
| :x:                | pavignol | StreamBlocksAltair                  |
| :heavy_check_mark: | pavignol | DomainData                          |
| :x:                | manu     | GetFeeRecipientByPubKey             |
| :heavy_check_mark: | manu     | CheckDoppelGanger                   |
| :heavy_check_mark: | dhruv    | GetSyncCommitteeContribution        |