From c5affaa7bf8a3b2237d1c7d99f2fed86363583e9 Mon Sep 17 00:00:00 2001 From: HaoyangLiu Date: Thu, 27 Sep 2018 19:36:15 +0800 Subject: [PATCH] Remove docs/clients/lcd-rest-api.yaml and add its content to client/lcd/swagger-ui/swagger.json --- Gopkg.lock | 9 - client/lcd/root.go | 115 +-- client/lcd/swagger-ui/swagger.json | 1265 +++++++++++++++++++++++-- client/rpc/block.go | 2 +- client/rpc/status.go | 2 +- client/rpc/validators.go | 2 +- cmd/gaia/cmd/gaiacli/main.go | 1 - docs/clients/lcd-rest-api.yaml | 936 ------------------ examples/basecoin/cmd/basecli/main.go | 1 - 9 files changed, 1207 insertions(+), 1126 deletions(-) delete mode 100644 docs/clients/lcd-rest-api.yaml diff --git a/Gopkg.lock b/Gopkg.lock index b03eabd91..05019f84a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -304,14 +304,6 @@ pruneopts = "UT" revision = "05ee40e3a273f7245e8777337fc7b46e533a9a92" -[[projects]] - digest = "1:ea0700160aca4ef099f4e06686a665a87691f4248dddd40796925eda2e46bd64" - name = "github.com/rakyll/statik" - packages = ["fs"] - pruneopts = "UT" - revision = "aa8a7b1baecd0f31a436bf7956fcdcc609a83035" - version = "v0.1.4" - [[projects]] digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" @@ -647,7 +639,6 @@ "github.com/gorilla/mux", "github.com/mattn/go-isatty", "github.com/pkg/errors", - "github.com/rakyll/statik/fs", "github.com/spf13/cobra", "github.com/spf13/pflag", "github.com/spf13/viper", diff --git a/client/lcd/root.go b/client/lcd/root.go index 1e389646e..be5ae1ddf 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -18,12 +18,12 @@ import ( slashing "github.com/cosmos/cosmos-sdk/x/slashing/client/rest" stake "github.com/cosmos/cosmos-sdk/x/stake/client/rest" "github.com/gorilla/mux" + "github.com/rakyll/statik/fs" "github.com/spf13/cobra" "github.com/spf13/viper" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" tmserver "github.com/tendermint/tendermint/rpc/lib/server" - "github.com/rakyll/statik/fs" ) const ( @@ -134,119 +134,6 @@ func createHandler(cdc *codec.Codec) http.Handler { panic(err) } - cliCtx := context.NewCLIContext().WithCodec(cdc).WithLogger(os.Stdout) - - // TODO: make more functional? aka r = keys.RegisterRoutes(r) - r.HandleFunc("/version", CLIVersionRequestHandler).Methods("GET") - r.HandleFunc("/node_version", NodeVersionRequestHandler(cliCtx)).Methods("GET") - - keys.RegisterRoutes(r) - rpc.RegisterRoutes(cliCtx, r) - tx.RegisterRoutes(cliCtx, r, cdc) - auth.RegisterRoutes(cliCtx, r, cdc, "acc") - bank.RegisterRoutes(cliCtx, r, cdc, kb) - stake.RegisterRoutes(cliCtx, r, cdc, kb) - slashing.RegisterRoutes(cliCtx, r, cdc, kb) - gov.RegisterRoutes(cliCtx, r, cdc) - - return r -} - -// ServeLiteCommand will generate a long-running rest server for gaia-lite -func ServeLiteCommand(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "lite-server", - Short: "Start Gaia-lite (light-client daemon), a local REST server with swagger-ui, default url: http://localhost:1317/swagger-ui/", - RunE: func(cmd *cobra.Command, args []string) (err error) { - listenAddr := viper.GetString(flagListenAddr) - handler := createLiteHandler(cdc) - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "gaia-lite") - maxOpen := viper.GetInt(flagMaxOpenConnections) - sslHosts := viper.GetString(flagSSLHosts) - certFile := viper.GetString(flagSSLCertFile) - keyFile := viper.GetString(flagSSLKeyFile) - cleanupFunc := func() {} - - var listener net.Listener - var fingerprint string - if viper.GetBool(flagInsecure) { - listener, err = tmserver.StartHTTPServer( - listenAddr, handler, logger, - tmserver.Config{MaxOpenConnections: maxOpen}, - ) - if err != nil { - return - } - } else { - if certFile != "" { - // validateCertKeyFiles() is needed to work around tendermint/tendermint#2460 - err = validateCertKeyFiles(certFile, keyFile) - if err != nil { - return err - } - // cert/key pair is provided, read the fingerprint - fingerprint, err = fingerprintFromFile(certFile) - if err != nil { - return err - } - } else { - // if certificate is not supplied, generate a self-signed one - certFile, keyFile, fingerprint, err = genCertKeyFilesAndReturnFingerprint(sslHosts) - if err != nil { - return err - } - cleanupFunc = func() { - os.Remove(certFile) - os.Remove(keyFile) - } - defer cleanupFunc() - } - listener, err = tmserver.StartHTTPAndTLSServer( - listenAddr, handler, - certFile, keyFile, - logger, - tmserver.Config{MaxOpenConnections: maxOpen}, - ) - if err != nil { - return - } - logger.Info(fingerprint) - } - logger.Info("Gaia-lite REST server started") - - // wait forever and cleanup - cmn.TrapSignal(func() { - defer cleanupFunc() - err := listener.Close() - logger.Error("error closing listener", "err", err) - }) - - return nil - }, - } - - cmd.Flags().String(flagListenAddr, "tcp://localhost:1317", "The address for the server to listen on") - cmd.Flags().Bool(flagInsecure, false, "Do not set up SSL/TLS layer") - cmd.Flags().String(flagSSLHosts, "", "Comma-separated hostnames and IPs to generate a certificate for") - cmd.Flags().String(flagSSLCertFile, "", "Path to a SSL certificate file. If not supplied, a self-signed certificate will be generated.") - cmd.Flags().String(flagSSLKeyFile, "", "Path to a key file; ignored if a certificate file is not supplied.") - cmd.Flags().String(flagCORS, "", "Set the domains that can make CORS requests (* for all)") - cmd.Flags().String(client.FlagChainID, "", "Chain ID of Tendermint node") - cmd.Flags().String(client.FlagNode, "tcp://localhost:26657", "Address of the node to connect to") - cmd.Flags().Int(flagMaxOpenConnections, 1000, "The number of maximum open connections") - cmd.Flags().Bool(client.FlagTrustNode, false, "Trust connected full node (don't verify proofs for responses)") - - return cmd -} - -func createLiteHandler(cdc *codec.Codec) *mux.Router { - r := mux.NewRouter() - - kb, err := keys.GetKeyBase() //XXX - if err != nil { - panic(err) - } - statikFS, err := fs.New() if err != nil { panic(err) diff --git a/client/lcd/swagger-ui/swagger.json b/client/lcd/swagger-ui/swagger.json index bd9e0bd2e..c688a01cc 100644 --- a/client/lcd/swagger-ui/swagger.json +++ b/client/lcd/swagger-ui/swagger.json @@ -1,72 +1,694 @@ { "swagger": "2.0", "info": { - "description": "All Gaia-lite supported APIs will be shown by this swagger-ui page. You can access these APIs on this page.", - "version": "1.0", - "title": "Gaia-lite Swagger-UI", - "termsOfService": "https://explorecosmos.network/", - "contact": { - "name": "Cosmos", - "url": "https://cosmos.network/" + "version": "1.1.0", + "title": "Gaia-Lite (former LCD) to interface with Cosmos BaseServer via REST", + "description": "Specification for Gaia-lite provided by `gaiacli rest-server`" + }, + "tags": [ + { + "name": "keys", + "description": "Key management to add or view local private keys" }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + { + "name": "send", + "description": "Create and sign a send tx" + }, + { + "name": "stake", + "description": "Stake module API for staking and validation" + }, + { + "name": "account", + "description": "Query account balance" + }, + { + "name": "query", + "description": "Information about blocks and txs" + }, + { + "name": "validator set", + "description": "Check the state of the validator set" + }, + { + "name": "node", + "description": "Information of the connected node" + }, + { + "name": "version", + "description": "Information about the app version" + } + ], + "securityDefinitions": { + "kms": { + "type": "basic" } }, - "basePath": "/", "paths": { + "/version": { + "get": { + "summary": "Version of Gaia-lite", + "tags": [ + "version" + ], + "description": "Get the version of gaia-lite running locally to compare against expected", + "responses": { + "200": { + "description": "Plaintext version i.e. \"v0.5.0\"" + } + } + } + }, "/node_version": { "get": { + "summary": "Version of the connected node", "tags": [ - "Version" + "node" ], - "summary": "Get connected full node version", - "description": "Get connected full node version", - "consumes": [ - "application/json" + "description": "Get the version of the SDK running on the connected node to compare against expected", + "responses": { + "200": { + "description": "Plaintext version i.e. \"v0.5.0\"" + } + } + } + }, + "/node_info": { + "get": { + "description": "Information about the connected node", + "summary": "The properties of the connected node", + "tags": [ + "node" ], "produces": [ "application/json" ], "responses": { "200": { - "description": "OK", + "description": "Node status", "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/common.HTTPError" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/common.HTTPError" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/common.HTTPError" + "type": "object", + "properties": { + "pub_key": { + "$ref": "#/definitions/PubKey" + }, + "moniker": { + "type": "string", + "example": "159.89.198.221" + }, + "network": { + "type": "string", + "example": "gaia-2" + }, + "remote_addr": { + "type": "string" + }, + "listen_addr": { + "type": "string", + "example": "192.168.56.1:26656" + }, + "version": { + "description": "Tendermint version", + "type": "string", + "example": "0.15.0" + }, + "other": { + "description": "more information on versions", + "type": "array", + "items": { + "type": "string" + } + } + } } } } } }, - "/version": { + "/syncing": { "get": { + "summary": "Syncing state of node", "tags": [ - "Version" + "node" + ], + "description": "Get if the node is currently syning with other nodes", + "responses": { + "200": { + "description": "\"true\" or \"false\"" + } + } + } + }, + "/keys": { + "get": { + "summary": "List of accounts stored locally", + "tags": [ + "keys" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Array of accounts", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Account" + } + } + } + } + }, + "post": { + "summary": "Create a new account locally", + "tags": [ + "keys" ], - "summary": "Get Gaia-lite version", - "description": "Get Gaia-lite version", "consumes": [ "application/json" ], + "parameters": [ + { + "in": "body", + "name": "account", + "description": "The account to create", + "schema": { + "type": "object", + "required": [ + "name", + "password", + "seed" + ], + "properties": { + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "seed": { + "type": "string" + } + } + } + } + ], + "responses": { + "200": { + "description": "Returns address of the account created" + } + } + } + }, + "/keys/seed": { + "get": { + "summary": "Create a new seed to create a new account with", + "tags": [ + "keys" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "16 word Seed", + "schema": { + "type": "string" + } + } + } + } + }, + "/keys/{name}": { + "parameters": [ + { + "in": "path", + "name": "name", + "description": "Account name", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Get a certain locally stored account", + "tags": [ + "keys" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Locally stored account", + "schema": { + "$ref": "#/definitions/Account" + } + }, + "404": { + "description": "Account is not available" + } + } + }, + "put": { + "summary": "Update the password for this account in the KMS", + "tags": [ + "keys" + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "account", + "description": "The new and old password", + "schema": { + "type": "object", + "required": [ + "new_password", + "old_password" + ], + "properties": { + "new_password": { + "type": "string" + }, + "old_password": { + "type": "string" + } + } + } + } + ], + "responses": { + "200": { + "description": "Updated password" + }, + "401": { + "description": "Password is wrong" + }, + "404": { + "description": "Account is not available" + } + } + }, + "delete": { + "summary": "Remove an account", + "tags": [ + "keys" + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "account", + "description": "The password of the account to remove from the KMS", + "schema": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "password": { + "type": "string" + } + } + } + } + ], + "responses": { + "200": { + "description": "Removed account" + }, + "401": { + "description": "Password is wrong" + }, + "404": { + "description": "Account is not available" + } + } + } + }, + "/accounts/{address}": { + "parameters": [ + { + "in": "path", + "name": "address", + "description": "Account address in bech32 format", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Get the account balances", + "tags": [ + "account" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Account balances", + "schema": { + "$ref": "#/definitions/Balance" + } + }, + "204": { + "description": "There is no data for the requested account. This is not a 404 as the account might exist, just does not hold data." + } + } + } + }, + "/accounts/{address}/send": { + "parameters": [ + { + "in": "path", + "name": "address", + "description": "Account address in bech32 format", + "required": true, + "type": "string" + } + ], + "post": { + "summary": "Send coins (build -> sign -> send)", + "tags": [ + "send" + ], + "security": [ + { + "kms": [ + + ] + } + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "account", + "description": "The password of the account to remove from the KMS", + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/Coins" + } + }, + "chain_id": { + "type": "string" + }, + "squence": { + "type": "number" + } + } + } + } + ], + "responses": { + "202": { + "description": "Tx was send and will probably be added to the next block" + }, + "400": { + "description": "The Tx was malformated" + } + } + } + }, + "/blocks/latest": { + "get": { + "summary": "Get the latest block", + "tags": [ + "query" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "The latest block", + "schema": { + "$ref": "#/definitions/Block" + } + } + } + } + }, + "/blocks/{height}": { + "parameters": [ + { + "in": "path", + "name": "height", + "description": "Block height", + "required": true, + "type": "number" + } + ], + "get": { + "summary": "Get a block at a certain height", + "tags": [ + "query" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "The block at a specific height", + "schema": { + "$ref": "#/definitions/Block" + } + }, + "404": { + "description": "Block at height is not available" + } + } + } + }, + "/validatorsets/latest": { + "get": { + "summary": "Get the latest validator set", + "tags": [ + "validator set" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "The validator set at the latest block height", + "schema": { + "type": "object", + "properties": { + "block_height": { + "type": "number" + }, + "validators": { + "type": "array", + "items": { + "$ref": "#/definitions/Validator" + } + } + } + } + } + } + } + }, + "/validatorsets/{height}": { + "parameters": [ + { + "in": "path", + "name": "height", + "description": "Block height", + "required": true, + "type": "number" + } + ], + "get": { + "summary": "Get a validator set a certain height", + "tags": [ + "validator set" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "The validator set at a specific block height", + "schema": { + "type": "object", + "properties": { + "block_height": { + "type": "number" + }, + "validators": { + "type": "array", + "items": { + "$ref": "#/definitions/Validator" + } + } + } + } + }, + "404": { + "description": "Block at height not available" + } + } + } + }, + "/txs/{hash}": { + "parameters": [ + { + "in": "path", + "name": "hash", + "description": "Tx hash", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Get a Tx by hash", + "tags": [ + "query" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "Tx with the provided hash", + "schema": { + "$ref": "#/definitions/Tx" + } + }, + "404": { + "description": "Tx not available for provided hash" + } + } + } + }, + "/stake/delegators/{delegatorAddr}": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "AccAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Get all delegations (delegation, undelegation) from a delegator", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/validators": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "Bech32 AccAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Query all validators that a delegator is bonded to", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/validators/{validatorAddr}": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "Bech32 AccAddress of Delegator", + "required": true, + "type": "string" + }, + { + "in": "path", + "name": "validatorAddr", + "description": "Bech32 ValAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Query a validator that a delegator is bonded to", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/txs": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "AccAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Get all staking txs (i.e msgs) from a delegator", + "tags": [ + "stake" + ], "produces": [ "application/json" ], @@ -74,47 +696,566 @@ "200": { "description": "OK", "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/common.HTTPError" + "$ref": "#/definitions/Tx" } }, "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/common.HTTPError" - } + "description": "Not Found" }, "500": { - "description": "Internal Server Error", + "description": "Internal Server Error" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/delegations": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "Bech32 AccAddress of Delegator", + "required": true, + "type": "string" + } + ], + "post": { + "summary": "Submit delegation", + "parameters": [ + { + "in": "body", + "name": "delegation", + "description": "The password of the account to remove from the KMS", "schema": { - "$ref": "#/definitions/common.HTTPError" + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "account_number": { + "type": "number" + }, + "delegations": { + "type": "array", + "items": { + "type": "string" + } + }, + "begin_unbondings": { + "type": "array", + "items": { + "type": "string" + } + }, + "complete_unbondings": { + "type": "array", + "items": { + "type": "string" + } + }, + "begin_redelegates": { + "type": "array", + "items": { + "type": "string" + } + }, + "complete_redelegates": { + "type": "array", + "items": { + "type": "string" + } + }, + "chain_id": { + "type": "string" + }, + "gas": { + "type": "number" + }, + "sequence": { + "type": "number" + } + } } } + ], + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Tx" + } + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/delegations/{validatorAddr}": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "Bech32 AccAddress of Delegator", + "required": true, + "type": "string" + }, + { + "in": "path", + "name": "validatorAddr", + "description": "Bech32 ValAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Query the current delegation status between a delegator and a validator", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/stake/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr}": { + "parameters": [ + { + "in": "path", + "name": "delegatorAddr", + "description": "Bech32 AccAddress of Delegator", + "required": true, + "type": "string" + }, + { + "in": "path", + "name": "validatorAddr", + "description": "Bech32 ValAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Query all unbonding delegations between a delegator and a validator", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/stake/validators": { + "get": { + "summary": "Get all validator candidates", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/stake/validators/{validatorAddr}": { + "parameters": [ + { + "in": "path", + "name": "validatorAddr", + "description": "Bech32 ValAddress of Delegator", + "required": true, + "type": "string" + } + ], + "get": { + "summary": "Query the information from a single validator", + "tags": [ + "stake" + ], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } } } } }, "definitions": { - "common.HTTPError": { + "Address": { + "type": "string", + "description": "bech32 encoded addres", + "example": "cosmos:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq" + }, + "ValidatorAddress": { + "type": "string", + "description": "bech32 encoded addres", + "example": "cosmosvaloper:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq" + }, + "PubKey": { + "type": "string", + "description": "bech32 encoded public key", + "example": "cosmospub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq" + }, + "ValidatorPubKey": { + "type": "string", + "description": "bech32 encoded public key", + "example": "cosmosvalconspub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq" + }, + "Coins": { "type": "object", "properties": { - "rest api": { + "denom": { "type": "string", - "example": "2.0" + "example": "steak" }, - "code": { - "type": "integer", - "example": 500 + "amount": { + "type": "number", + "example": 50 + } + } + }, + "Hash": { + "type": "string", + "example": "EE5F3404034C524501629B56E0DDC38FAD651F04" + }, + "Tx": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "stake/delegate" + ] }, - "error message": { - "type": "string" + "data": { + "type": "object" + } + } + }, + "TxChain": { + "type": "object", + "properties": { + "type": { + "type": "string", + "default": "chain/tx" + }, + "data": { + "type": "object", + "properties": { + "chain_id": { + "type": "string", + "example": "gaia-2" + }, + "expires_at": { + "type": "number", + "example": 0 + }, + "tx": { + "type": "object", + "properties": { + "type": { + "type": "string", + "default": "nonce" + }, + "data": { + "type": "object", + "properties": { + "sequence": { + "type": "number", + "example": 0 + }, + "signers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "chain": { + "type": "string", + "example": "" + }, + "app": { + "type": "string", + "default": "sigs" + }, + "addr": { + "$ref": "#/definitions/Address" + } + } + } + }, + "tx": { + "$ref": "#/definitions/Tx" + } + } + } + } + } + } + } + } + }, + "TxBuild": { + "type": "object", + "properties": { + "type": { + "type": "string", + "default": "sigs/one" + }, + "data": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/Tx" + }, + "signature": { + "type": "object", + "properties": { + "Sig": { + "type": "string", + "default": "" + }, + "Pubkey": { + "type": "string", + "default": "" + } + } + } + } + } + } + }, + "TxSigned": { + "type": "object", + "properties": { + "type": { + "type": "string", + "default": "sigs/one" + }, + "data": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/Tx" + }, + "signature": { + "type": "object", + "properties": { + "Sig": { + "type": "string", + "example": "81B11E717789600CC192B26F452A983DF13B985EE75ABD9DD9E68D7BA007A958" + }, + "Pubkey": { + "$ref": "#/definitions/PubKey" + } + } + } + } + } + } + }, + "Account": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Main Account" + }, + "address": { + "$ref": "#/definitions/Address" + }, + "pub_key": { + "$ref": "#/definitions/PubKey" + } + } + }, + "Balance": { + "type": "object", + "properties": { + "height": { + "type": "number", + "example": 123456 + }, + "coins": { + "type": "array", + "items": { + "$ref": "#/definitions/Coins" + } + }, + "credit": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "BlockID": { + "type": "object", + "properties": { + "hash": { + "$ref": "#/definitions/Hash" + }, + "parts": { + "type": "object", + "properties": { + "total": { + "type": "number", + "example": 0 + }, + "hash": { + "$ref": "#/definitions/Hash" + } + } + } + } + }, + "Block": { + "type": "object", + "properties": { + "header": { + "type": "object", + "properties": { + "chain_id": { + "type": "string", + "example": "gaia-2" + }, + "height": { + "type": "number", + "example": 1 + }, + "time": { + "type": "string", + "example": "2017-12-30T05:53:09.287+01:00" + }, + "num_txs": { + "type": "number", + "example": 0 + }, + "last_block_id": { + "$ref": "#/definitions/BlockID" + }, + "total_txs": { + "type": "number", + "example": 35 + }, + "last_commit_hash": { + "$ref": "#/definitions/Hash" + }, + "data_hash": { + "$ref": "#/definitions/Hash" + }, + "validators_hash": { + "$ref": "#/definitions/Hash" + }, + "consensus_hash": { + "$ref": "#/definitions/Hash" + }, + "app_hash": { + "$ref": "#/definitions/Hash" + }, + "last_results_hash": { + "$ref": "#/definitions/Hash" + }, + "evidence_hash": { + "$ref": "#/definitions/Hash" + } + } + }, + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/Tx" + } + }, + "evidence": { + "type": "array", + "items": { + "type": "object" + } + }, + "last_commit": { + "type": "object", + "properties": { + "blockID": { + "$ref": "#/definitions/BlockID" + }, + "precommits": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + } + }, + "Validator": { + "type": "object", + "properties": { + "address": { + "$ref": "#/definitions/ValidatorAddress" + }, + "pub_key": { + "$ref": "#/definitions/ValidatorPubKey" + }, + "power": { + "type": "number", + "example": 1000 + }, + "accum": { + "type": "number", + "example": 1000 } } } - } + }, + "schemes": [ + "https" + ] } \ No newline at end of file diff --git a/client/rpc/block.go b/client/rpc/block.go index 3824bc3e5..3a9b63dde 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -61,7 +61,7 @@ func getBlock(cliCtx context.CLIContext, height *int64) ([]byte, error) { // TODO move maarshalling into cmd/rest functions // output, err := tmcodec.MarshalJSON(res) - output, err := cdc.MarshalJSON(res) + output, err := cdc.MarshalJSONIndent(res, "", " ") if err != nil { return nil, err } diff --git a/client/rpc/status.go b/client/rpc/status.go index ea090d32f..4472d8dbb 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -64,7 +64,7 @@ func NodeInfoRequestHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { } nodeInfo := status.NodeInfo - output, err := cdc.MarshalJSON(nodeInfo) + output, err := cdc.MarshalJSONIndent(nodeInfo, "", " ") if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 0583dc054..e8b78ecef 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -94,7 +94,7 @@ func getValidators(cliCtx context.CLIContext, height *int64) ([]byte, error) { } } - output, err := cdc.MarshalJSON(outputValidatorsRes) + output, err := cdc.MarshalJSONIndent(outputValidatorsRes, "", " ") if err != nil { return nil, err } diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 203a4d797..92aac6923 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -54,7 +54,6 @@ func main() { rootCmd.AddCommand( tendermintCmd, lcd.ServeCommand(cdc), - lcd.ServeLiteCommand(cdc), client.LineBreak, ) diff --git a/docs/clients/lcd-rest-api.yaml b/docs/clients/lcd-rest-api.yaml deleted file mode 100644 index 9b7301de6..000000000 --- a/docs/clients/lcd-rest-api.yaml +++ /dev/null @@ -1,936 +0,0 @@ -swagger: '2.0' -info: - version: '1.1.0' - title: Gaia-Lite (former LCD) to interface with Cosmos BaseServer via REST - description: Specification for Gaia-lite provided by `gaiacli rest-server` - -tags: -- name: keys - description: Key management to add or view local private keys -- name: send - description: Create and sign a send tx -- name: stake - description: Stake module API for staking and validation -- name: account - description: Query account balance -- name: query - description: Information about blocks and txs -- name: validator set - description: Check the state of the validator set -- name: node - description: Information of the connected node -- name: version - description: Information about the app version - - -securityDefinitions: - kms: - type: basic - -paths: - /version: - get: - summary: Version of Gaia-lite - tags: - - version - description: Get the version of gaia-lite running locally to compare against expected - responses: - 200: - description: Plaintext version i.e. "v0.5.0" - /node_version: - get: - summary: Version of the connected node - tags: - - node - description: Get the version of the SDK running on the connected node to compare against expected - responses: - 200: - description: Plaintext version i.e. "v0.5.0" - /node_info: - get: - description: Information about the connected node - summary: The properties of the connected node - tags: - - node - produces: - - application/json - responses: - 200: - description: Node status - schema: - type: object - properties: - pub_key: - $ref: '#/definitions/PubKey' - moniker: - type: string - example: 159.89.198.221 - network: - type: string - example: gaia-2 - remote_addr: - type: string - listen_addr: - type: string - example: 192.168.56.1:26656 - version: - description: Tendermint version - type: string - example: 0.15.0 - other: - description: more information on versions - type: array - items: - type: string - /syncing: - get: - summary: Syncing state of node - tags: - - node - description: Get if the node is currently syning with other nodes - responses: - 200: - description: '"true" or "false"' - - /keys: - get: - summary: List of accounts stored locally - tags: - - keys - produces: - - application/json - responses: - 200: - description: Array of accounts - schema: - type: array - items: - $ref: '#/definitions/Account' - post: - summary: Create a new account locally - tags: - - keys - consumes: - - application/json - parameters: - - in: body - name: account - description: The account to create - schema: - type: object - required: - - name - - password - - seed - properties: - name: - type: string - password: - type: string - seed: - type: string - responses: - 200: - description: Returns address of the account created - /keys/seed: - get: - summary: Create a new seed to create a new account with - tags: - - keys - produces: - - application/json - responses: - 200: - description: 16 word Seed - schema: - type: string - /keys/{name}: - parameters: - - in: path - name: name - description: Account name - required: true - type: string - get: - summary: Get a certain locally stored account - tags: - - keys - produces: - - application/json - responses: - 200: - description: Locally stored account - schema: - $ref: "#/definitions/Account" - 404: - description: Account is not available - put: - summary: Update the password for this account in the KMS - tags: - - keys - consumes: - - application/json - parameters: - - in: body - name: account - description: The new and old password - schema: - type: object - required: - - new_password - - old_password - properties: - new_password: - type: string - old_password: - type: string - responses: - 200: - description: Updated password - 401: - description: Password is wrong - 404: - description: Account is not available - delete: - summary: Remove an account - tags: - - keys - consumes: - - application/json - parameters: - - in: body - name: account - description: The password of the account to remove from the KMS - schema: - type: object - required: - - password - properties: - password: - type: string - responses: - 200: - description: Removed account - 401: - description: Password is wrong - 404: - description: Account is not available -# /accounts/send: - # post: - # summary: Send coins (build -> sign -> send) - # security: - # - sign: [] - # requestBody: - # content: - # application/json: - # schema: - # type: object - # properties: - # fees: - # $ref: "#/definitions/Coins" - # outputs: - # type: array - # items: - # type: object - # properties: - # pub_key: - # $ref: "#/definitions/PubKey" - # amount: - # type: array - # items: - # $ref: "#/definitions/Coins" - # responses: - # 202: - # description: Tx was send and will probably be added to the next block - # 400: - # description: The Tx was malformated - - /accounts/{address}: - parameters: - - in: path - name: address - description: Account address in bech32 format - required: true - type: string - get: - summary: Get the account balances - tags: - - account - produces: - - application/json - responses: - 200: - description: Account balances - schema: - $ref: "#/definitions/Balance" - 204: - description: There is no data for the requested account. This is not a 404 as the account might exist, just does not hold data. - /accounts/{address}/send: - parameters: - - in: path - name: address - description: Account address in bech32 format - required: true - type: string - post: - summary: Send coins (build -> sign -> send) - tags: - - send - security: - - kms: [] - consumes: - - application/json - parameters: - - in: body - name: account - description: The password of the account to remove from the KMS - schema: - type: object - properties: - name: - type: string - password: - type: string - amount: - type: array - items: - $ref: "#/definitions/Coins" - chain_id: - type: string - squence: - type: number - responses: - 202: - description: Tx was send and will probably be added to the next block - 400: - description: The Tx was malformated - /blocks/latest: - get: - summary: Get the latest block - tags: - - query - produces: - - application/json - responses: - 200: - description: The latest block - schema: - $ref: "#/definitions/Block" - /blocks/{height}: - parameters: - - in: path - name: height - description: Block height - required: true - type: number - get: - summary: Get a block at a certain height - tags: - - query - produces: - - application/json - responses: - 200: - description: The block at a specific height - schema: - $ref: "#/definitions/Block" - 404: - description: Block at height is not available - /validatorsets/latest: - get: - summary: Get the latest validator set - tags: - - validator set - produces: - - application/json - responses: - 200: - description: The validator set at the latest block height - schema: - type: object - properties: - block_height: - type: number - validators: - type: array - items: - $ref: "#/definitions/Validator" - /validatorsets/{height}: - parameters: - - in: path - name: height - description: Block height - required: true - type: number - get: - summary: Get a validator set a certain height - tags: - - validator set - produces: - - application/json - responses: - 200: - description: The validator set at a specific block height - schema: - type: object - properties: - block_height: - type: number - validators: - type: array - items: - $ref: "#/definitions/Validator" - 404: - description: Block at height not available - # /txs: - # parameters: - # - in: query - # name: tag - # schema: - # type: string - # example: "coin.sender=EE5F3404034C524501629B56E0DDC38FAD651F04" - # required: true - # - in: query - # name: page - # description: Pagination page - # schema: - # type: number - # default: 0 - # - in: query - # name: size - # description: Pagination size - # schema: - # type: number - # default: 50 - # get: - # summary: Query Tx - # responses: - # 200: - # description: All Tx matching the provided tags - # content: - # application/json: - # schema: - # type: array - # items: - # $ref: "#/definitions/Tx" - # 404: - # description: Pagination is out of bounds - # /txs/sign: - # post: - # summary: Sign a Tx - # description: Sign a Tx providing locally stored account and according password - # security: - # - sign: [] - # requestBody: - # content: - # application/json: - # schema: - # $ref: "#/definitions/TxBuild" - # responses: - # 200: - # description: The signed Tx - # content: - # application/json: - # schema: - # $ref: "#/definitions/TxSigned" - # 401: - # description: Account name and/or password where wrong - # /txs/broadcast: - # post: - # summary: Send signed Tx - # requestBody: - # content: - # application/json: - # schema: - # $ref: "#/definitions/TxSigned" - # responses: - # 202: - # description: Tx was send and will probably be added to the next block - # 400: - # description: The Tx was malformated - /txs/{hash}: - parameters: - - in: path - name: hash - description: Tx hash - required: true - type: string - get: - summary: Get a Tx by hash - tags: - - query - produces: - - application/json - responses: - 200: - description: Tx with the provided hash - schema: - $ref: "#/definitions/Tx" - 404: - description: Tx not available for provided hash - -# ================== Staking Module # ================== - -# TODO create D - /stake/delegators/{delegatorAddr}: - parameters: - - in: path - name: delegatorAddr - description: AccAddress of Delegator - required: true - type: string - get: - summary: Get all delegations (delegation, undelegation) from a delegator - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - 500: - description: Internal Server Error - - /stake/delegators/{delegatorAddr}/validators: - parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string - get: - summary: Query all validators that a delegator is bonded to - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - - /stake/delegators/{delegatorAddr}/validators/{validatorAddr}: - parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string - - in: path - name: validatorAddr - description: Bech32 ValAddress of Delegator - required: true - type: string - get: - summary: Query a validator that a delegator is bonded to - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - - /stake/delegators/{delegatorAddr}/txs: - parameters: - - in: path - name: delegatorAddr - description: AccAddress of Delegator - required: true - type: string - get: - summary: Get all staking txs (i.e msgs) from a delegator - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - schema: - $ref: "#/definitions/Tx" - 404: - description: Not Found - 500: - description: Internal Server Error - - /stake/delegators/{delegatorAddr}/delegations: - parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string - post: - summary: Submit delegation - parameters: - - in: body - name: delegation - description: The password of the account to remove from the KMS - schema: - type: object - properties: - name: - type: string - password: - type: string - account_number: - type: number - delegations: - type: array - items: - type: string - begin_unbondings: - type: array - items: - type: string - complete_unbondings: - type: array - items: - type: string - begin_redelegates: - type: array - items: - type: string - complete_redelegates: - type: array - items: - type: string - chain_id: - type: string - gas: - type: number - sequence: - type: number - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - schema: - $ref: "#/definitions/Tx" - 404: - description: Not Found - 500: - description: Internal Server Error - - /stake/delegators/{delegatorAddr}/delegations/{validatorAddr}: - parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string - - in: path - name: validatorAddr - description: Bech32 ValAddress of Delegator - required: true - type: string - get: - summary: Query the current delegation status between a delegator and a validator - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - - /stake/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr}: - parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string - - in: path - name: validatorAddr - description: Bech32 ValAddress of Delegator - required: true - type: string - get: - summary: Query all unbonding delegations between a delegator and a validator - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - 500: - description: Internal Server Error - - /stake/validators: - get: - summary: Get all validator candidates - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 500: - description: Internal Server Error - - /stake/validators/{validatorAddr}: - parameters: - - in: path - name: validatorAddr - description: Bech32 ValAddress of Delegator - required: true - type: string - get: - summary: Query the information from a single validator - tags: - - stake - produces: - - application/json - responses: - 200: - description: OK - 404: - description: Not Found - 500: - description: Internal Server Error - -# TODO Add staking definitions -definitions: - Address: - type: string - description: bech32 encoded addres - example: cosmos:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq - ValidatorAddress: - type: string - description: bech32 encoded addres - example: cosmosvaloper:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq - PubKey: - type: string - description: bech32 encoded public key - example: cosmospub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq - ValidatorPubKey: - type: string - description: bech32 encoded public key - example: cosmosvalconspub:zgnkwr7eyyv643dllwfpdwensmgdtz89yu73zq - Coins: - type: object - properties: - denom: - type: string - example: steak - amount: - type: number - example: 50 - Hash: - type: string - example: EE5F3404034C524501629B56E0DDC38FAD651F04 - Tx: - type: object - properties: - type: - type: string - enum: - - stake/delegate - data: - type: object - TxChain: - type: object - properties: - type: - type: string - default: chain/tx - data: - type: object - properties: - chain_id: - type: string - example: gaia-2 - expires_at: - type: number - example: 0 - tx: - type: object - properties: - type: - type: string - default: nonce - data: - type: object - properties: - sequence: - type: number - example: 0 - signers: - type: array - items: - type: object - properties: - chain: - type: string - example: '' - app: - type: string - default: sigs - addr: - $ref: "#/definitions/Address" - tx: - $ref: "#/definitions/Tx" - TxBuild: - type: object - properties: - type: - type: string - default: sigs/one - data: - type: object - properties: - tx: - $ref: "#/definitions/Tx" - signature: - type: object - properties: - Sig: - type: string - default: '' - Pubkey: - type: string - default: '' - TxSigned: - type: object - properties: - type: - type: string - default: sigs/one - data: - type: object - properties: - tx: - $ref: "#/definitions/Tx" - signature: - type: object - properties: - Sig: - type: string - example: 81B11E717789600CC192B26F452A983DF13B985EE75ABD9DD9E68D7BA007A958 - Pubkey: - $ref: "#/definitions/PubKey" - Account: - type: object - properties: - name: - type: string - example: Main Account - address: - $ref: "#/definitions/Address" - pub_key: - $ref: "#/definitions/PubKey" - Balance: - type: object - properties: - height: - type: number - example: 123456 - coins: - type: array - items: - $ref: "#/definitions/Coins" - credit: - type: array - items: - type: object - BlockID: - type: object - properties: - hash: - $ref: "#/definitions/Hash" - parts: - type: object - properties: - total: - type: number - example: 0 - hash: - $ref: "#/definitions/Hash" - Block: - type: object - properties: - header: - type: object - properties: - chain_id: - type: string - example: gaia-2 - height: - type: number - example: 1 - time: - type: string - example: '2017-12-30T05:53:09.287+01:00' - num_txs: - type: number - example: 0 - last_block_id: - $ref: "#/definitions/BlockID" - total_txs: - type: number - example: 35 - last_commit_hash: - $ref: "#/definitions/Hash" - data_hash: - $ref: "#/definitions/Hash" - validators_hash: - $ref: "#/definitions/Hash" - consensus_hash: - $ref: "#/definitions/Hash" - app_hash: - $ref: "#/definitions/Hash" - last_results_hash: - $ref: "#/definitions/Hash" - evidence_hash: - $ref: "#/definitions/Hash" - txs: - type: array - items: - $ref: "#/definitions/Tx" - evidence: - type: array - items: - type: object - last_commit: - type: object - properties: - blockID: - $ref: "#/definitions/BlockID" - precommits: - type: array - items: - type: object - Validator: - type: object - properties: - address: - $ref: '#/definitions/ValidatorAddress' - pub_key: - $ref: "#/definitions/ValidatorPubKey" - power: - type: number - example: 1000 - accum: - type: number - example: 1000 -# Added by API Auto Mocking Plugin -host: virtserver.swaggerhub.com -basePath: /faboweb1/Cosmos-LCD-2/1.0.0 -schemes: - - https diff --git a/examples/basecoin/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go index 0cd2581cc..cbfae5fe0 100644 --- a/examples/basecoin/cmd/basecli/main.go +++ b/examples/basecoin/cmd/basecli/main.go @@ -80,7 +80,6 @@ func main() { rootCmd.AddCommand( client.LineBreak, lcd.ServeCommand(cdc), - lcd.ServeLiteCommand(cdc), keys.Commands(), client.LineBreak, version.VersionCmd,