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  }