@@ -69,6 +69,8 @@ func (s *Service) handleRPC(w http.ResponseWriter, r *http.Request) {
6969 s .handleListEpochs (w , r , req )
7070 case "cartesi_getEpoch" :
7171 s .handleGetEpoch (w , r , req )
72+ case "cartesi_getLastAcceptedEpoch" :
73+ s .handleGetLastAcceptedEpoch (w , r , req )
7274 case "cartesi_listInputs" :
7375 s .handleListInputs (w , r , req )
7476 case "cartesi_getInput" :
@@ -320,6 +322,40 @@ func (s *Service) handleGetEpoch(w http.ResponseWriter, r *http.Request, req RPC
320322 writeRPCResult (w , req .ID , result )
321323}
322324
325+ func (s * Service ) handleGetLastAcceptedEpoch (w http.ResponseWriter , r * http.Request , req RPCRequest ) {
326+ var params GetEpochParams
327+ if err := json .Unmarshal (req .Params , & params ); err != nil {
328+ writeRPCError (w , req .ID , JSONRPC_INVALID_PARAMS , "Invalid params" , nil )
329+ return
330+ }
331+
332+ // Validate application parameter
333+ if err := validateNameOrAddress (params .Application ); err != nil {
334+ writeRPCError (w , req .ID , JSONRPC_INVALID_PARAMS , fmt .Sprintf ("Invalid application identifier: %v" , err ), nil )
335+ return
336+ }
337+
338+ epoch , err := s .repository .GetLastAcceptedEpoch (r .Context (), params .Application )
339+ if err != nil {
340+ s .Logger .Error ("Unable to retrieve epoch from repository" , "err" , err )
341+ writeRPCError (w , req .ID , JSONRPC_INTERNAL_ERROR , "Internal server error" , nil )
342+ return
343+ }
344+ if epoch == nil {
345+ writeRPCError (w , req .ID , JSONRPC_RESOURCE_NOT_FOUND , "Epoch not found" , nil )
346+ return
347+ }
348+
349+ // Format response according to spec
350+ result := struct {
351+ Data * model.Epoch `json:"data"`
352+ }{
353+ Data : epoch ,
354+ }
355+
356+ writeRPCResult (w , req .ID , result )
357+ }
358+
323359func (s * Service ) handleListInputs (w http.ResponseWriter , r * http.Request , req RPCRequest ) {
324360 var params ListInputsParams
325361 if err := json .Unmarshal (req .Params , & params ); err != nil {
0 commit comments