mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 00:07:51 +00:00 
			
		
		
		
	add custom lcd with decode endpoint
This commit is contained in:
		
							parent
							
								
									666a034608
								
							
						
					
					
						commit
						7eda45c6d7
					
				@ -9,7 +9,6 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/keys"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/lcd"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/rpc"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/tx"
 | 
			
		||||
 | 
			
		||||
@ -20,6 +19,7 @@ import (
 | 
			
		||||
	//stakecmd "github.com/cosmos/cosmos-sdk/x/stake/client/cli"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/internal/app"
 | 
			
		||||
	"github.com/kava-labs/kava/internal/lcd"
 | 
			
		||||
	//"github.com/kava-labs/kava/internal/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										58
									
								
								internal/lcd/decode.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								internal/lcd/decode.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
package lcd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	//"encoding/hex"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/context"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/wire"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/auth"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TxBody struct {
 | 
			
		||||
	TxBase64 string `json:"txbase64"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Decode a tx from base64 into json
 | 
			
		||||
func DecodeTxRequestHandlerFn(ctx context.CoreContext, cdc *wire.Codec) http.HandlerFunc {
 | 
			
		||||
	return func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		// get the input base64 string
 | 
			
		||||
		var m TxBody
 | 
			
		||||
		decoder := json.NewDecoder(r.Body)
 | 
			
		||||
		err := decoder.Decode(&m)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			w.WriteHeader(400)
 | 
			
		||||
			w.Write([]byte(err.Error()))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// convert from base64 string to bytes
 | 
			
		||||
		txBytes, err := base64.StdEncoding.DecodeString(m.TxBase64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			w.WriteHeader(400)
 | 
			
		||||
			w.Write([]byte(err.Error()))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// convert bytes to Tx struct
 | 
			
		||||
		var tx auth.StdTx
 | 
			
		||||
		err = cdc.UnmarshalBinary(txBytes, &tx)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			w.WriteHeader(400)
 | 
			
		||||
			w.Write([]byte(err.Error()))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// convert Tx struct to json (bytes) and return
 | 
			
		||||
		output, err := cdc.MarshalJSON(tx)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			w.WriteHeader(500)
 | 
			
		||||
			w.Write([]byte(err.Error()))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		w.Write(output)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										85
									
								
								internal/lcd/root.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								internal/lcd/root.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,85 @@
 | 
			
		||||
package lcd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
	"github.com/tendermint/tmlibs/log"
 | 
			
		||||
 | 
			
		||||
	tmserver "github.com/tendermint/tendermint/rpc/lib/server"
 | 
			
		||||
	cmn "github.com/tendermint/tmlibs/common"
 | 
			
		||||
 | 
			
		||||
	client "github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/context"
 | 
			
		||||
	keys "github.com/cosmos/cosmos-sdk/client/keys"
 | 
			
		||||
	rpc "github.com/cosmos/cosmos-sdk/client/rpc"
 | 
			
		||||
	tx "github.com/cosmos/cosmos-sdk/client/tx"
 | 
			
		||||
	version "github.com/cosmos/cosmos-sdk/version"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/wire"
 | 
			
		||||
	auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
 | 
			
		||||
	bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest"
 | 
			
		||||
	//ibc "github.com/cosmos/cosmos-sdk/x/ibc/client/rest"
 | 
			
		||||
	//stake "github.com/cosmos/cosmos-sdk/x/stake/client/rest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ServeCommand will generate a long-running rest server
 | 
			
		||||
// (aka Light Client Daemon) that exposes functionality similar
 | 
			
		||||
// to the cli, but over rest
 | 
			
		||||
func ServeCommand(cdc *wire.Codec) *cobra.Command {
 | 
			
		||||
	flagListenAddr := "laddr"
 | 
			
		||||
	flagCORS := "cors"
 | 
			
		||||
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:   "rest-server",
 | 
			
		||||
		Short: "Start LCD (light-client daemon), a local REST server",
 | 
			
		||||
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
			
		||||
			listenAddr := viper.GetString(flagListenAddr)
 | 
			
		||||
			handler := createHandler(cdc)
 | 
			
		||||
			logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).
 | 
			
		||||
				With("module", "rest-server")
 | 
			
		||||
			listener, err := tmserver.StartHTTPServer(listenAddr, handler, logger)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			logger.Info("REST server started")
 | 
			
		||||
 | 
			
		||||
			// Wait forever and cleanup
 | 
			
		||||
			cmn.TrapSignal(func() {
 | 
			
		||||
				err := listener.Close()
 | 
			
		||||
				logger.Error("Error closing listener", "err", err)
 | 
			
		||||
			})
 | 
			
		||||
			return nil
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	cmd.Flags().StringP(flagListenAddr, "a", "tcp://localhost:1317", "Address for server to listen on")
 | 
			
		||||
	cmd.Flags().String(flagCORS, "", "Set to domains that can make CORS requests (* for all)")
 | 
			
		||||
	cmd.Flags().StringP(client.FlagChainID, "c", "", "ID of chain we connect to")
 | 
			
		||||
	cmd.Flags().StringP(client.FlagNode, "n", "tcp://localhost:46657", "Node to connect to")
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createHandler(cdc *wire.Codec) http.Handler {
 | 
			
		||||
	r := mux.NewRouter()
 | 
			
		||||
	r.HandleFunc("/version", version.RequestHandler).Methods("GET")
 | 
			
		||||
 | 
			
		||||
	kb, err := keys.GetKeyBase() //XXX
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx := context.NewCoreContextFromViper()
 | 
			
		||||
 | 
			
		||||
	// TODO make more functional? aka r = keys.RegisterRoutes(r)
 | 
			
		||||
	keys.RegisterRoutes(r)
 | 
			
		||||
	rpc.RegisterRoutes(ctx, r)
 | 
			
		||||
	tx.RegisterRoutes(ctx, r, cdc)
 | 
			
		||||
	auth.RegisterRoutes(ctx, r, cdc, "acc")
 | 
			
		||||
	bank.RegisterRoutes(ctx, r, cdc, kb)
 | 
			
		||||
	//ibc.RegisterRoutes(ctx, r, cdc, kb)
 | 
			
		||||
	//stake.RegisterRoutes(ctx, r, cdc, kb)
 | 
			
		||||
	r.HandleFunc("/decode_tx", DecodeTxRequestHandlerFn(ctx, cdc)).Methods("POST")
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								internal/lcd/wire.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								internal/lcd/wire.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
package lcd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	amino "github.com/tendermint/go-amino"
 | 
			
		||||
	ctypes "github.com/tendermint/tendermint/rpc/core/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var cdc = amino.NewCodec()
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	ctypes.RegisterAmino(cdc)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user