github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/rpc/apimiddleware/endpoint_factory.go (about) 1 package apimiddleware 2 3 import ( 4 "github.com/pkg/errors" 5 "github.com/prysmaticlabs/prysm/shared/gateway" 6 ) 7 8 // BeaconEndpointFactory creates endpoints used for running beacon chain API calls through the API Middleware. 9 type BeaconEndpointFactory struct { 10 } 11 12 func (f *BeaconEndpointFactory) IsNil() bool { 13 return f == nil 14 } 15 16 // Paths is a collection of all valid beacon chain API paths. 17 func (f *BeaconEndpointFactory) Paths() []string { 18 return []string{ 19 "/eth/v1/beacon/genesis", 20 "/eth/v1/beacon/states/{state_id}/root", 21 "/eth/v1/beacon/states/{state_id}/fork", 22 "/eth/v1/beacon/states/{state_id}/finality_checkpoints", 23 "/eth/v1/beacon/states/{state_id}/validators", 24 "/eth/v1/beacon/states/{state_id}/validators/{validator_id}", 25 "/eth/v1/beacon/states/{state_id}/validator_balances", 26 "/eth/v1/beacon/states/{state_id}/committees", 27 "/eth/v1/beacon/headers", 28 "/eth/v1/beacon/headers/{block_id}", 29 "/eth/v1/beacon/blocks", 30 "/eth/v1/beacon/blocks/{block_id}", 31 "/eth/v1/beacon/blocks/{block_id}/root", 32 "/eth/v1/beacon/blocks/{block_id}/attestations", 33 "/eth/v1/beacon/pool/attestations", 34 "/eth/v1/beacon/pool/attester_slashings", 35 "/eth/v1/beacon/pool/proposer_slashings", 36 "/eth/v1/beacon/pool/voluntary_exits", 37 "/eth/v1/node/identity", 38 "/eth/v1/node/peers", 39 "/eth/v1/node/peers/{peer_id}", 40 "/eth/v1/node/peer_count", 41 "/eth/v1/node/version", 42 "/eth/v1/node/syncing", 43 "/eth/v1/node/health", 44 "/eth/v1/debug/beacon/states/{state_id}", 45 "/eth/v1/debug/beacon/heads", 46 "/eth/v1/config/fork_schedule", 47 "/eth/v1/config/deposit_contract", 48 "/eth/v1/config/spec", 49 "/eth/v1/events", 50 } 51 } 52 53 // Create returns a new endpoint for the provided API path. 54 func (f *BeaconEndpointFactory) Create(path string) (*gateway.Endpoint, error) { 55 var endpoint gateway.Endpoint 56 switch path { 57 case "/eth/v1/beacon/genesis": 58 endpoint = gateway.Endpoint{ 59 GetResponse: &genesisResponseJson{}, 60 Err: &gateway.DefaultErrorJson{}, 61 } 62 case "/eth/v1/beacon/states/{state_id}/root": 63 endpoint = gateway.Endpoint{ 64 GetResponse: &stateRootResponseJson{}, 65 Err: &gateway.DefaultErrorJson{}, 66 } 67 case "/eth/v1/beacon/states/{state_id}/fork": 68 endpoint = gateway.Endpoint{ 69 GetResponse: &stateForkResponseJson{}, 70 Err: &gateway.DefaultErrorJson{}, 71 } 72 case "/eth/v1/beacon/states/{state_id}/finality_checkpoints": 73 endpoint = gateway.Endpoint{ 74 GetResponse: &stateFinalityCheckpointResponseJson{}, 75 Err: &gateway.DefaultErrorJson{}, 76 } 77 case "/eth/v1/beacon/states/{state_id}/validators": 78 endpoint = gateway.Endpoint{ 79 GetRequestQueryParams: []gateway.QueryParam{{Name: "id", Hex: true}, {Name: "status", Enum: true}}, 80 GetResponse: &stateValidatorsResponseJson{}, 81 Err: &gateway.DefaultErrorJson{}, 82 } 83 case "/eth/v1/beacon/states/{state_id}/validators/{validator_id}": 84 endpoint = gateway.Endpoint{ 85 GetResponse: &stateValidatorResponseJson{}, 86 Err: &gateway.DefaultErrorJson{}, 87 } 88 case "/eth/v1/beacon/states/{state_id}/validator_balances": 89 endpoint = gateway.Endpoint{ 90 GetRequestQueryParams: []gateway.QueryParam{{Name: "id", Hex: true}}, 91 GetResponse: &validatorBalancesResponseJson{}, 92 Err: &gateway.DefaultErrorJson{}, 93 } 94 case "/eth/v1/beacon/states/{state_id}/committees": 95 endpoint = gateway.Endpoint{ 96 GetRequestQueryParams: []gateway.QueryParam{{Name: "epoch"}, {Name: "index"}, {Name: "slot"}}, 97 GetResponse: &stateCommitteesResponseJson{}, 98 Err: &gateway.DefaultErrorJson{}, 99 } 100 case "/eth/v1/beacon/headers": 101 endpoint = gateway.Endpoint{ 102 GetRequestQueryParams: []gateway.QueryParam{{Name: "slot"}, {Name: "parent_root", Hex: true}}, 103 GetResponse: &blockHeadersResponseJson{}, 104 Err: &gateway.DefaultErrorJson{}, 105 } 106 case "/eth/v1/beacon/headers/{block_id}": 107 endpoint = gateway.Endpoint{ 108 GetResponse: &blockHeaderResponseJson{}, 109 Err: &gateway.DefaultErrorJson{}, 110 } 111 case "/eth/v1/beacon/blocks": 112 endpoint = gateway.Endpoint{ 113 PostRequest: &beaconBlockContainerJson{}, 114 Err: &gateway.DefaultErrorJson{}, 115 Hooks: gateway.HookCollection{ 116 OnPostDeserializeRequestBodyIntoContainer: []gateway.Hook{prepareGraffiti}, 117 }, 118 } 119 case "/eth/v1/beacon/blocks/{block_id}": 120 endpoint = gateway.Endpoint{ 121 GetResponse: &blockResponseJson{}, 122 Err: &gateway.DefaultErrorJson{}, 123 Hooks: gateway.HookCollection{ 124 CustomHandlers: []gateway.CustomHandler{handleGetBeaconBlockSSZ}, 125 }, 126 } 127 case "/eth/v1/beacon/blocks/{block_id}/root": 128 endpoint = gateway.Endpoint{ 129 GetResponse: &blockRootResponseJson{}, 130 Err: &gateway.DefaultErrorJson{}, 131 } 132 case "/eth/v1/beacon/blocks/{block_id}/attestations": 133 endpoint = gateway.Endpoint{ 134 GetResponse: &blockAttestationsResponseJson{}, 135 Err: &gateway.DefaultErrorJson{}, 136 } 137 case "/eth/v1/beacon/pool/attestations": 138 endpoint = gateway.Endpoint{ 139 GetRequestQueryParams: []gateway.QueryParam{{Name: "slot"}, {Name: "committee_index"}}, 140 GetResponse: &attestationsPoolResponseJson{}, 141 PostRequest: &submitAttestationRequestJson{}, 142 Err: &submitAttestationsErrorJson{}, 143 Hooks: gateway.HookCollection{ 144 OnPostStart: []gateway.Hook{wrapAttestationsArray}, 145 }, 146 } 147 case "/eth/v1/beacon/pool/attester_slashings": 148 endpoint = gateway.Endpoint{ 149 PostRequest: &attesterSlashingJson{}, 150 GetResponse: &attesterSlashingsPoolResponseJson{}, 151 Err: &gateway.DefaultErrorJson{}, 152 } 153 case "/eth/v1/beacon/pool/proposer_slashings": 154 endpoint = gateway.Endpoint{ 155 PostRequest: &proposerSlashingJson{}, 156 GetResponse: &proposerSlashingsPoolResponseJson{}, 157 Err: &gateway.DefaultErrorJson{}, 158 } 159 case "/eth/v1/beacon/pool/voluntary_exits": 160 endpoint = gateway.Endpoint{ 161 PostRequest: &signedVoluntaryExitJson{}, 162 GetResponse: &voluntaryExitsPoolResponseJson{}, 163 Err: &gateway.DefaultErrorJson{}, 164 } 165 case "/eth/v1/node/identity": 166 endpoint = gateway.Endpoint{ 167 GetResponse: &identityResponseJson{}, 168 Err: &gateway.DefaultErrorJson{}, 169 } 170 case "/eth/v1/node/peers": 171 endpoint = gateway.Endpoint{ 172 GetRequestQueryParams: []gateway.QueryParam{{Name: "state", Enum: true}, {Name: "direction", Enum: true}}, 173 GetResponse: &peersResponseJson{}, 174 Err: &gateway.DefaultErrorJson{}, 175 } 176 case "/eth/v1/node/peers/{peer_id}": 177 endpoint = gateway.Endpoint{ 178 GetRequestURLLiterals: []string{"peer_id"}, 179 GetResponse: &peerResponseJson{}, 180 Err: &gateway.DefaultErrorJson{}, 181 } 182 case "/eth/v1/node/peer_count": 183 endpoint = gateway.Endpoint{ 184 GetResponse: &peerCountResponseJson{}, 185 Err: &gateway.DefaultErrorJson{}, 186 } 187 case "/eth/v1/node/version": 188 endpoint = gateway.Endpoint{ 189 GetResponse: &versionResponseJson{}, 190 Err: &gateway.DefaultErrorJson{}, 191 } 192 case "/eth/v1/node/syncing": 193 endpoint = gateway.Endpoint{ 194 GetResponse: &syncingResponseJson{}, 195 Err: &gateway.DefaultErrorJson{}, 196 } 197 case "/eth/v1/node/health": 198 endpoint = gateway.Endpoint{ 199 Err: &gateway.DefaultErrorJson{}, 200 } 201 case "/eth/v1/debug/beacon/states/{state_id}": 202 endpoint = gateway.Endpoint{ 203 GetResponse: &beaconStateResponseJson{}, 204 Err: &gateway.DefaultErrorJson{}, 205 Hooks: gateway.HookCollection{ 206 CustomHandlers: []gateway.CustomHandler{handleGetBeaconStateSSZ}, 207 }, 208 } 209 case "/eth/v1/debug/beacon/heads": 210 endpoint = gateway.Endpoint{ 211 GetResponse: &forkChoiceHeadsResponseJson{}, 212 Err: &gateway.DefaultErrorJson{}, 213 } 214 case "/eth/v1/config/fork_schedule": 215 endpoint = gateway.Endpoint{ 216 GetResponse: &forkScheduleResponseJson{}, 217 Err: &gateway.DefaultErrorJson{}, 218 } 219 case "/eth/v1/config/deposit_contract": 220 endpoint = gateway.Endpoint{ 221 GetResponse: &depositContractResponseJson{}, 222 Err: &gateway.DefaultErrorJson{}, 223 } 224 case "/eth/v1/config/spec": 225 endpoint = gateway.Endpoint{ 226 GetResponse: &specResponseJson{}, 227 Err: &gateway.DefaultErrorJson{}, 228 } 229 case "/eth/v1/events": 230 endpoint = gateway.Endpoint{ 231 Err: &gateway.DefaultErrorJson{}, 232 Hooks: gateway.HookCollection{ 233 CustomHandlers: []gateway.CustomHandler{handleEvents}, 234 }, 235 } 236 default: 237 return nil, errors.New("invalid path") 238 } 239 240 endpoint.Path = path 241 return &endpoint, nil 242 }