diff --git a/go.mod b/go.mod index 9aee2d1f4..2e1f77aec 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ replace ( cosmossdk.io/store => github.com/scrtlabs/cosmos-sdk-store v1.0.3 github.com/cometbft/cometbft => github.com/scrtlabs/tendermint v0.38.2 github.com/cosmos/cosmos-sdk => github.com/scrtlabs/cosmos-sdk v0.46.0-beta2.0.20240430231059-06a080edfca9 - github.com/cosmos/iavl => github.com/cosmos/iavl v1.0.3 + github.com/cosmos/iavl => github.com/scrtlabs/iavl v1.0.1 ) require ( diff --git a/go.sum b/go.sum index 9384862ed..be8503c99 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,6 @@ github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= -github.com/cosmos/iavl v1.0.3 h1:yNJ5oS6gZ4ZKg6NGE78F8xeF2jFU0TZqFiczUdtU9JA= -github.com/cosmos/iavl v1.0.3/go.mod h1:8xIUkgVvwvVrBu81scdPty+/Dx9GqwHnAvXz4cwF7RY= github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.1 h1:BHn+JWZILxkUT9IrlP1ctUfo9ENGi+EmiZ9om1XSHIw= github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.1/go.mod h1:82hPO/tRawbuFad2gPwChvpZ0JEIoNi91LwVneAYCeM= github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= @@ -957,6 +955,8 @@ github.com/scrtlabs/cosmos-sdk v0.46.0-beta2.0.20240430231059-06a080edfca9 h1:a+ github.com/scrtlabs/cosmos-sdk v0.46.0-beta2.0.20240430231059-06a080edfca9/go.mod h1:ehEJ6NYUAKWxVGMczCoQJ9XXbEURe1T8KG7mL5PAMok= github.com/scrtlabs/cosmos-sdk-store v1.0.3 h1:CBzurqDLXOGGLFPnMvGUKqL4lvnnBPVY28ZhVEpPID0= github.com/scrtlabs/cosmos-sdk-store v1.0.3/go.mod h1:EFtENTqVTuWwitGW1VwaBct+yDagk7oG/axBMPH+FXs= +github.com/scrtlabs/iavl v1.0.1 h1:WL9YhEvOp+guahFQD25m67NvVyrX3jC90sVpebODDVc= +github.com/scrtlabs/iavl v1.0.1/go.mod h1:8xIUkgVvwvVrBu81scdPty+/Dx9GqwHnAvXz4cwF7RY= github.com/scrtlabs/tendermint v0.38.2 h1:a2L2v70guPMvQNbr38Cl5jwuLRBJim1iznBV+4x7fyU= github.com/scrtlabs/tendermint v0.38.2/go.mod h1:FbzZXk9nkr7atxsGcBn6tlM6Q+BD4GA6wlgY5Qk3FzQ= github.com/scrtlabs/tm-secret-enclave v1.11.3 h1:3WVDS4x11tidRvCK/FbemtuVDMgujvSzMSt9sKLaMwY= diff --git a/integration-tests/basic-tests.sh b/integration-tests/basic-tests.sh new file mode 100755 index 000000000..2b5bfe171 --- /dev/null +++ b/integration-tests/basic-tests.sh @@ -0,0 +1,124 @@ +#!/bin/bash + +SECRETCLI=${1:-./secretcli} +SECRETD_HOME=${2:-$HOME/.secretd_local} +CHAINID=${3:-secretdev-1} +SECRETD=${4:-"http://localhost:26657"} + +if ! [ -f $SECRETD_HOME/config/genesis.json ]; then + echo "Cannot find $SECRETD_HOME/config/genesis.json." + exit 1 +fi + +set -x +set -o errexit + +$SECRETCLI config set client chain-id "$CHAINID" +$SECRETCLI config set client output json +$SECRETCLI config set client keyring-backend test +$SECRETCLI config set client node $SECRETD + +$SECRETCLI status --output=json | js + +$SECRETCLI keys list --keyring-backend="test" --home=$SECRETD_HOME --output=json | jq + +address_v=$($SECRETCLI keys show -a validator --keyring-backend="test" --home=$SECRETD_HOME) + +address_a=$($SECRETCLI keys show -a a --keyring-backend="test" --home=$SECRETD_HOME) +address_b=$($SECRETCLI keys show -a b --keyring-backend="test" --home=$SECRETD_HOME) +address_c=$($SECRETCLI keys show -a c --keyring-backend="test" --home=$SECRETD_HOME) +address_d=$($SECRETCLI keys show -a d --keyring-backend="test" --home=$SECRETD_HOME) + +key_a=$($SECRETCLI keys show -p a --keyring-backend="test" --home=$SECRETD_HOME) +key_b=$($SECRETCLI keys show -p b --keyring-backend="test" --home=$SECRETD_HOME) +key_c=$($SECRETCLI keys show -p c --keyring-backend="test" --home=$SECRETD_HOME) +key_d=$($SECRETCLI keys show -p d --keyring-backend="test" --home=$SECRETD_HOME) + +$SECRETCLI q bank balances $address_a --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_b --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_c --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_d --home=$SECRETD_HOME --output=json | jq + +# $SECRETCLI tx bank send $address_a $address_b 10uscrt --gas=auto --gas-adjustment=1.0 --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq + +txhash=$($SECRETCLI tx bank send $address_a $address_b 10uscrt --gas-prices=0.25uscrt -y --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq ".txhash" | sed 's/"//g') +echo "FIX: $SECRETCLI q tx --type="hash" "$txhash" --home=$SECRETD_HOME" +$SECRETCLI q bank balances $address_a --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_b --home=$SECRETD_HOME --output=json | jq + +txhash=$($SECRETCLI tx bank send $address_b $address_c 10uscrt --gas-prices=0.25uscrt -y --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq ".txhash" | sed 's/"//g') +echo "FIX: $SECRETCLI q tx --type="hash" "$txhash" --home=$SECRETD_HOME" +$SECRETCLI q bank balances $address_b --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_c --home=$SECRETD_HOME --output=json | jq + +txhash=$($SECRETCLI tx bank send $address_c $address_d 10uscrt --gas-prices=0.25uscrt -y --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq ".txhash" | sed 's/"//g') +echo "FIX: $SECRETCLI q tx --type="hash" "$txhash" --home=$SECRETD_HOME" +$SECRETCLI q bank balances $address_c --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_d --home=$SECRETD_HOME --output=json | jq + +txhash=$($SECRETCLI tx bank send $address_d $address_a 10uscrt --gas-prices=0.25uscrt -y --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq ".txhash" | sed 's/"//g') +echo "FIX: $SECRETCLI q tx --type="hash" "$txhash" --home=$SECRETD_HOME" +$SECRETCLI q bank balances $address_d --home=$SECRETD_HOME --output=json | jq +$SECRETCLI q bank balances $address_a --home=$SECRETD_HOME --output=json | jq + + +$SECRETCLI q distribution params --output=json | jq + +$SECRETCLI q distribution community-pool --output=json | jq + +address_valop=$(jq '.app_state.genutil.gen_txs[0].body.messages[0].validator_address' $SECRETD_HOME/config/genesis.json) + +if [[ -z $address_valop ]];then + echo "No GENESIS tx in genesis.json" + exit 1 +fi + +address_valop=$(echo $address_valop | sed 's/"//g') +$SECRETCLI q distribution validator-outstanding-rewards $address_valop --output=json | jq + +$SECRETCLI q distribution commission $address_valop --output=json | jq + +echo "FIXME: get realistic height" +$SECRETCLI q distribution slashes $address_valop "1" "10" --output=json | jq + +DIR=$(pwd) +WORK_DIR=$(mktemp -d -p ${DIR}) +if [ ! -d $WORK_DIR ]; then + echo "Could not create $WORK_DIR" + exit 1 +fi + +function cleanup { + echo "Clean up $WORK_DIR" + #rm -rf "$WORK_DIR" +} + +trap cleanup EXIT + + +cd $WORK_DIR + +cargo generate --git https://github.com/scrtlabs/secret-template.git --name secret-test-contract + +cd secret-test-contract +make build + +if [[ ! contract.wasm.gz ]];then + echo "failed to build a test contract" + cd - + return 1 +fi + +cd $DIR +echo "FIXME: add deploy contract" + +$SECRETCLI keys add scrt_smart_contract -y --keyring-backend="test" --home=$SECRETD_HOME --output=json | jq +address_scrt=$($SECRETCLI keys show -a scrt_smart_contract --keyring-backend="test" --home=$SECRETD_HOME) +$SECRETCLI q bank balances $address_scrt --home=$SECRETD_HOME --output=json | jq +#curl http://localhost:5000/faucet?address=$address_scrt +txhash=$($SECRETCLI tx bank send $address_a $address_scrt 100000uscrt --gas-prices=0.25uscrt -y --chain-id=$CHAINID --home=$SECRETD_HOME --keyring-backend="test" --output=json | jq ".txhash" | sed 's/"//g') +$SECRETCLI q bank balances $address_scrt --home=$SECRETD_HOME --output=json | jq + +$SECRETCLI tx compute store $WORK_DIR/secret-test-contract/contract.wasm -y --gas 50000 --from $address_scrt --chain-id=$CHAINID --keyring-backend="test" --home=$SECRETD_HOME --output=json | jq + +$SECRETCLI q compute list-code --home=$SECRETD_HOME \ No newline at end of file diff --git a/integration-tests/test-contracts/contract.wasm.gz b/integration-tests/test-contracts/contract.wasm.gz new file mode 100644 index 000000000..220520c57 Binary files /dev/null and b/integration-tests/test-contracts/contract.wasm.gz differ diff --git a/scripts/start-node.sh b/scripts/start-node.sh index 6ff8cf816..908bc4ff1 100755 --- a/scripts/start-node.sh +++ b/scripts/start-node.sh @@ -79,4 +79,4 @@ fi # Start the secretd -LOG_LEVEL=trace $SECRETD start --pruning=nothing --bootstrap --home=$SECRETD_HOME --log_level=info +LOG_LEVEL=trace $SECRETD start --pruning=nothing --bootstrap --home=$SECRETD_HOME --log_level=debug diff --git a/x/compute/client/cli/query.go b/x/compute/client/cli/query.go new file mode 100644 index 000000000..33773ec0f --- /dev/null +++ b/x/compute/client/cli/query.go @@ -0,0 +1,604 @@ +package cli + +import ( + "context" + "fmt" + + // wasmvm "github.com/CosmWasm/wasmvm/v2" + "github.com/spf13/cobra" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + + "github.com/scrtlabs/SecretNetwork/x/compute/internal/types" +) + +func GetQueryCmd() *cobra.Command { + queryCmd := &cobra.Command{ + Use: types.ModuleName, + Short: "Querying commands for the wasm module", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + SilenceUsage: true, + } + queryCmd.AddCommand( + GetCmdListCode(), + // GetCmdListContractByCode(), + // GetCmdQueryCode(), + // GetCmdQueryCodeInfo(), + // GetCmdGetContractInfo(), + // GetCmdGetContractHistory(), + // GetCmdGetContractState(), + // GetCmdListPinnedCode(), + // GetCmdQueryParams(), + // GetCmdListContractsByCreator(), + ) + return queryCmd +} + +// GetCmdListCode -> gRPC into x/compute/internal/keeper/querier.go: Codes(c context.Context, _ *empty.Empty) +func GetCmdListCode() *cobra.Command { + cmd := &cobra.Command{ + Use: "list-code", + Short: "List all wasm bytecode on the chain", + Long: "List all wasm bytecode on the chain", + Aliases: []string{"list-codes", "codes", "lco"}, + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + res, err := queryClient.Codes( + context.Background(), + &emptypb.Empty{}, + ) + if err != nil { + return err + } + return clientCtx.PrintProto(res) + }, + SilenceUsage: true, + } + flags.AddQueryFlagsToCmd(cmd) + addPaginationFlags(cmd, "list codes") + return cmd +} + +// // GetCmdListContractByCode lists all wasm code uploaded for given code id +// func GetCmdListContractByCode() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "list-contract-by-code [code_id]", +// Short: "List wasm all bytecode on the chain for given code id", +// Long: "List wasm all bytecode on the chain for given code id", +// Aliases: []string{"list-contracts-by-code", "list-contracts", "contracts", "lca"}, +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// codeID, err := strconv.ParseUint(args[0], 10, 64) +// if err != nil { +// return err +// } +// if codeID == 0 { +// return errors.New("empty code id") +// } + +// pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.ContractsByCode( +// context.Background(), +// &types.QueryContractsByCodeRequest{ +// CodeId: codeID, +// Pagination: pageReq, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// addPaginationFlags(cmd, "list contracts by code") +// return cmd +// } + +// // GetCmdQueryCode returns the bytecode for a given contract +// func GetCmdQueryCode() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "code [code_id] [output filename]", +// Short: "Downloads wasm bytecode for given code id", +// Long: "Downloads wasm bytecode for given code id", +// Aliases: []string{"source-code", "source"}, +// Args: cobra.ExactArgs(2), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// codeID, err := strconv.ParseUint(args[0], 10, 64) +// if err != nil { +// return err +// } + +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.Code( +// context.Background(), +// &types.QueryCodeRequest{ +// CodeId: codeID, +// }, +// ) +// if err != nil { +// return err +// } +// if len(res.Data) == 0 { +// return fmt.Errorf("contract not found") +// } + +// fmt.Printf("Downloading wasm code to %s\n", args[1]) +// return os.WriteFile(args[1], res.Data, 0o600) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// return cmd +// } + +// // GetCmdQueryCodeInfo returns the code info for a given code id +// func GetCmdQueryCodeInfo() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "code-info [code_id]", +// Short: "Prints out metadata of a code id", +// Long: "Prints out metadata of a code id", +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// codeID, err := strconv.ParseUint(args[0], 10, 64) +// if err != nil { +// return err +// } + +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.Code( +// context.Background(), +// &types.QueryCodeRequest{ +// CodeId: codeID, +// }, +// ) +// if err != nil { +// return err +// } +// if res.CodeInfoResponse == nil { +// return fmt.Errorf("contract not found") +// } + +// return clientCtx.PrintProto(res.CodeInfoResponse) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// return cmd +// } + +// // GetCmdGetContractInfo gets details about a given contract +// func GetCmdGetContractInfo() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "contract [bech32_address]", +// Short: "Prints out metadata of a contract given its address", +// Long: "Prints out metadata of a contract given its address", +// Aliases: []string{"meta", "c"}, +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.ContractInfo( +// context.Background(), +// &types.QueryContractInfoRequest{ +// Address: args[0], +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// return cmd +// } + +// // GetCmdGetContractState dumps full internal state of a given contract +// func GetCmdGetContractState() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "contract-state", +// Short: "Querying commands for the wasm module", +// Aliases: []string{"state", "cs", "s"}, +// DisableFlagParsing: true, +// SuggestionsMinimumDistance: 2, +// RunE: client.ValidateCmd, +// SilenceUsage: true, +// } +// cmd.AddCommand( +// GetCmdGetContractStateAll(), +// GetCmdGetContractStateRaw(), +// GetCmdGetContractStateSmart(), +// ) +// return cmd +// } + +// func GetCmdGetContractStateAll() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "all [bech32_address]", +// Short: "Prints out all internal state of a contract given its address", +// Long: "Prints out all internal state of a contract given its address", +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } + +// pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.AllContractState( +// context.Background(), +// &types.QueryAllContractStateRequest{ +// Address: args[0], +// Pagination: pageReq, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// addPaginationFlags(cmd, "contract state") +// return cmd +// } + +// func GetCmdGetContractStateRaw() *cobra.Command { +// decoder := newArgDecoder(hex.DecodeString) +// cmd := &cobra.Command{ +// Use: "raw [bech32_address] [key]", +// Short: "Prints out internal state for key of a contract given its address", +// Long: "Prints out internal state for of a contract given its address", +// Args: cobra.ExactArgs(2), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } +// queryData, err := decoder.DecodeString(args[1]) +// if err != nil { +// return err +// } + +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.RawContractState( +// context.Background(), +// &types.QueryRawContractStateRequest{ +// Address: args[0], +// QueryData: queryData, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// decoder.RegisterFlags(cmd.PersistentFlags(), "key argument") +// flags.AddQueryFlagsToCmd(cmd) +// return cmd +// } + +// func GetCmdGetContractStateSmart() *cobra.Command { +// decoder := newArgDecoder(asciiDecodeString) +// cmd := &cobra.Command{ +// Use: "smart [bech32_address] [query]", +// Short: "Calls contract with given address with query data and prints the returned result", +// Long: "Calls contract with given address with query data and prints the returned result", +// Args: cobra.ExactArgs(2), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } +// if args[1] == "" { +// return errors.New("query data must not be empty") +// } + +// queryData, err := decoder.DecodeString(args[1]) +// if err != nil { +// return fmt.Errorf("decode query: %s", err) +// } +// if !json.Valid(queryData) { +// return errors.New("query data must be json") +// } + +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.SmartContractState( +// context.Background(), +// &types.QuerySmartContractStateRequest{ +// Address: args[0], +// QueryData: queryData, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// decoder.RegisterFlags(cmd.PersistentFlags(), "query argument") +// flags.AddQueryFlagsToCmd(cmd) +// return cmd +// } + +// // GetCmdGetContractHistory prints the code history for a given contract +// func GetCmdGetContractHistory() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "contract-history [bech32_address]", +// Short: "Prints out the code history for a contract given its address", +// Long: "Prints out the code history for a contract given its address", +// Aliases: []string{"history", "hist", "ch"}, +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } + +// pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.ContractHistory( +// context.Background(), +// &types.QueryContractHistoryRequest{ +// Address: args[0], +// Pagination: pageReq, +// }, +// ) +// if err != nil { +// return err +// } + +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } + +// flags.AddQueryFlagsToCmd(cmd) +// addPaginationFlags(cmd, "contract history") +// return cmd +// } + +// // GetCmdListPinnedCode lists all wasm code ids that are pinned +// func GetCmdListPinnedCode() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "pinned", +// Short: "List all pinned code ids", +// Long: "List all pinned code ids", +// Args: cobra.ExactArgs(0), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } + +// pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.PinnedCodes( +// context.Background(), +// &types.QueryPinnedCodesRequest{ +// Pagination: pageReq, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// addPaginationFlags(cmd, "list codes") +// return cmd +// } + +// // GetCmdListContractsByCreator lists all contracts by creator +// func GetCmdListContractsByCreator() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "list-contracts-by-creator [creator]", +// Short: "List all contracts by creator", +// Long: "List all contracts by creator", +// Args: cobra.ExactArgs(1), +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } +// _, err = sdk.AccAddressFromBech32(args[0]) +// if err != nil { +// return err +// } +// pageReq, err := client.ReadPageRequest(withPageKeyDecoded(cmd.Flags())) +// if err != nil { +// return err +// } + +// queryClient := types.NewQueryClient(clientCtx) +// res, err := queryClient.ContractsByCreator( +// context.Background(), +// &types.QueryContractsByCreatorRequest{ +// CreatorAddress: args[0], +// Pagination: pageReq, +// }, +// ) +// if err != nil { +// return err +// } +// return clientCtx.PrintProto(res) +// }, +// SilenceUsage: true, +// } +// flags.AddQueryFlagsToCmd(cmd) +// addPaginationFlags(cmd, "list contracts by creator") +// return cmd +// } + +// type argumentDecoder struct { +// // dec is the default decoder +// dec func(string) ([]byte, error) +// asciiF, hexF, b64F bool +// } + +// func newArgDecoder(def func(string) ([]byte, error)) *argumentDecoder { +// return &argumentDecoder{dec: def} +// } + +// func (a *argumentDecoder) RegisterFlags(f *flag.FlagSet, argName string) { +// f.BoolVar(&a.asciiF, "ascii", false, "ascii encoded "+argName) +// f.BoolVar(&a.hexF, "hex", false, "hex encoded "+argName) +// f.BoolVar(&a.b64F, "b64", false, "base64 encoded "+argName) +// } + +// func (a *argumentDecoder) DecodeString(s string) ([]byte, error) { +// found := -1 +// for i, v := range []*bool{&a.asciiF, &a.hexF, &a.b64F} { +// if !*v { +// continue +// } +// if found != -1 { +// return nil, errors.New("multiple decoding flags used") +// } +// found = i +// } +// switch found { +// case 0: +// return asciiDecodeString(s) +// case 1: +// return hex.DecodeString(s) +// case 2: +// return base64.StdEncoding.DecodeString(s) +// default: +// return a.dec(s) +// } +// } + +// func asciiDecodeString(s string) ([]byte, error) { +// return []byte(s), nil +// } + +// // sdk ReadPageRequest expects binary but we encoded to base64 in our marshaller +// func withPageKeyDecoded(flagSet *flag.FlagSet) *flag.FlagSet { +// encoded, err := flagSet.GetString(flags.FlagPageKey) +// if err != nil { +// panic(err.Error()) +// } +// raw, err := base64.StdEncoding.DecodeString(encoded) +// if err != nil { +// panic(err.Error()) +// } +// err = flagSet.Set(flags.FlagPageKey, string(raw)) +// if err != nil { +// panic(err.Error()) +// } +// return flagSet +// } + +// // GetCmdQueryParams implements a command to return the current wasm +// // parameters. +// func GetCmdQueryParams() *cobra.Command { +// cmd := &cobra.Command{ +// Use: "params", +// Short: "Query the current wasm parameters", +// Args: cobra.NoArgs, +// RunE: func(cmd *cobra.Command, args []string) error { +// clientCtx, err := client.GetClientQueryContext(cmd) +// if err != nil { +// return err +// } +// queryClient := types.NewQueryClient(clientCtx) + +// params := &types.QueryParamsRequest{} +// res, err := queryClient.Params(cmd.Context(), params) +// if err != nil { +// return err +// } + +// return clientCtx.PrintProto(&res.Params) +// }, +// SilenceUsage: true, +// } + +// flags.AddQueryFlagsToCmd(cmd) + +// return cmd +// } + +// supports a subset of the SDK pagination params for better resource utilization +func addPaginationFlags(cmd *cobra.Command, query string) { + cmd.Flags().String(flags.FlagPageKey, "", fmt.Sprintf("pagination page-key of %s to query for", query)) + cmd.Flags().Uint64(flags.FlagLimit, 100, fmt.Sprintf("pagination limit of %s to query for", query)) + cmd.Flags().Bool(flags.FlagReverse, false, "results are sorted in descending order") +} diff --git a/x/compute/internal/keeper/querier.go b/x/compute/internal/keeper/querier.go index c71ea9f1f..193757483 100644 --- a/x/compute/internal/keeper/querier.go +++ b/x/compute/internal/keeper/querier.go @@ -113,13 +113,12 @@ func (q GrpcQuerier) Code(c context.Context, req *types.QueryByCodeIdRequest) (* func (q GrpcQuerier) Codes(c context.Context, _ *empty.Empty) (*types.QueryCodesResponse, error) { response, err := queryCodeList(sdk.UnwrapSDKContext(c), q.keeper) - switch { - case err != nil: + if err != nil { return nil, err - case response == nil: - return nil, types.ErrNotFound } - + if response == nil { + response = make([]types.CodeInfoResponse, 0) + } return &types.QueryCodesResponse{CodeInfos: response}, nil } diff --git a/x/compute/module.go b/x/compute/module.go index c0891154f..56c5e42b8 100644 --- a/x/compute/module.go +++ b/x/compute/module.go @@ -5,6 +5,7 @@ import ( "encoding/json" "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -12,6 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + "github.com/scrtlabs/SecretNetwork/x/compute/client/cli" "github.com/scrtlabs/SecretNetwork/x/compute/internal/keeper" "github.com/scrtlabs/SecretNetwork/x/compute/internal/types" ) @@ -59,6 +61,14 @@ func (AppModuleBasic) ValidateGenesis(marshaler codec.JSONCodec, _ client.TxEnco return ValidateGenesis(data) } +func (b AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() +} + +func (b AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd() +} + // RegisterInterfaceTypes implements InterfaceModule func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) { types.RegisterInterfaces(registry)