Skip to content

Commit

Permalink
Problem: no decimal CRO display for account balance (fix #29)
Browse files Browse the repository at this point in the history
move prefix to module

add 1_cro_in_carson unit

tidy up error names

fix unit test
  • Loading branch information
leejw51crypto committed Sep 21, 2020
1 parent 55da3f5 commit 0484a05
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 45 deletions.
33 changes: 9 additions & 24 deletions app/prefix.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,41 +4,26 @@ import (
"log"

sdk "github.com/cosmos/cosmos-sdk/types"
)

const (
CoinType = 394
FundraiserPath = "44'/394'/0'/0/1"
)

var (
AccountAddressPrefix = "cro"
AccountPubKeyPrefix = "cropub"
ValidatorAddressPrefix = "crocncl"
ValidatorPubKeyPrefix = "crocnclpub"
ConsNodeAddressPrefix = "crocnclcons"
ConsNodePubKeyPrefix = "crocnclconspub"
HumanCoinUnit = "cro"
BaseCoinUnit = "basecro" // 10^-8 AKA "carson"
chain "github.com/crypto-com/chain-main/x/chainmain"
)

func SetConfig() {
config := sdk.GetConfig()
config.SetBech32PrefixForAccount(AccountAddressPrefix, AccountPubKeyPrefix)
config.SetBech32PrefixForValidator(ValidatorAddressPrefix, ValidatorPubKeyPrefix)
config.SetBech32PrefixForConsensusNode(ConsNodeAddressPrefix, ConsNodePubKeyPrefix)
config.SetBech32PrefixForAccount(chain.AccountAddressPrefix, chain.AccountPubKeyPrefix)
config.SetBech32PrefixForValidator(chain.ValidatorAddressPrefix, chain.ValidatorPubKeyPrefix)
config.SetBech32PrefixForConsensusNode(chain.ConsNodeAddressPrefix, chain.ConsNodePubKeyPrefix)

config.SetCoinType(CoinType)
config.SetFullFundraiserPath(FundraiserPath)
config.SetCoinType(chain.CoinType)
config.SetFullFundraiserPath(chain.FundraiserPath)

croUnit := sdk.OneDec()
err := sdk.RegisterDenom(HumanCoinUnit, croUnit)
err := sdk.RegisterDenom(chain.HumanCoinUnit, croUnit)
if err != nil {
log.Fatal(err)
}

carsonUnit := sdk.NewDecWithPrec(1, 8) // 10^-8 (carson)
err = sdk.RegisterDenom(BaseCoinUnit, carsonUnit)
carsonUnit := sdk.NewDecWithPrec(1, int64(chain.CroExponential)) // 10^-8 (carson)
err = sdk.RegisterDenom(chain.BaseCoinUnit, carsonUnit)

if err != nil {
log.Fatal(err)
Expand Down
17 changes: 9 additions & 8 deletions app/prefix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
keys "github.com/cosmos/cosmos-sdk/crypto/keyring"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/crypto-com/chain-main/app"
chain "github.com/crypto-com/chain-main/x/chainmain"
"github.com/stretchr/testify/require"
)

Expand All @@ -19,7 +20,7 @@ func TestMnemonic(t *testing.T) {
//nolint:lll
"point shiver hurt flight fun online hub antenna engine pave chef fantasy front interest poem accident catch load frequent praise elite pet remove used",
"",
app.FundraiserPath,
chain.FundraiserPath,
hd.Secp256k1,
)
require.NoError(t, err)
Expand All @@ -45,15 +46,15 @@ func TestConversion(t *testing.T) {
result sdk.Coin
expErr bool
}{
{sdk.NewCoin("foo", sdk.ZeroInt()), app.HumanCoinUnit, sdk.Coin{}, true},
{sdk.NewCoin(app.HumanCoinUnit, sdk.ZeroInt()), "foo", sdk.Coin{}, true},
{sdk.NewCoin(app.HumanCoinUnit, sdk.ZeroInt()), "FOO", sdk.Coin{}, true},
{sdk.NewCoin("foo", sdk.ZeroInt()), chain.HumanCoinUnit, sdk.Coin{}, true},
{sdk.NewCoin(chain.HumanCoinUnit, sdk.ZeroInt()), "foo", sdk.Coin{}, true},
{sdk.NewCoin(chain.HumanCoinUnit, sdk.ZeroInt()), "FOO", sdk.Coin{}, true},

{sdk.NewCoin(app.HumanCoinUnit, sdk.NewInt(5)),
app.BaseCoinUnit, sdk.NewCoin(app.BaseCoinUnit, sdk.NewInt(500000000)), false}, // cro => carson
{sdk.NewCoin(chain.HumanCoinUnit, sdk.NewInt(5)),
chain.BaseCoinUnit, sdk.NewCoin(chain.BaseCoinUnit, sdk.NewInt(500000000)), false}, // cro => carson

{sdk.NewCoin(app.BaseCoinUnit, sdk.NewInt(500000000)),
app.HumanCoinUnit, sdk.NewCoin(app.HumanCoinUnit, sdk.NewInt(5)), false}, // carson => cro
{sdk.NewCoin(chain.BaseCoinUnit, sdk.NewInt(500000000)),
chain.HumanCoinUnit, sdk.NewCoin(chain.HumanCoinUnit, sdk.NewInt(5)), false}, // carson => cro

}

Expand Down
12 changes: 7 additions & 5 deletions cmd/chain-maind/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import (
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
"github.com/crypto-com/chain-main/app"

chain "github.com/crypto-com/chain-main/x/chainmain"
)

// NewRootCmd creates a new root command for chain-maind. It is called once in the
Expand Down Expand Up @@ -72,7 +74,7 @@ func convertCoin(s string) string {
if err != nil {
panic(err)
}
coin, err = sdk.ConvertCoin(coin, app.BaseCoinUnit)
coin, err = sdk.ConvertCoin(coin, chain.BaseCoinUnit)
if err != nil {
panic(err)
}
Expand All @@ -85,7 +87,7 @@ func convertCoins(s string) string {
panic(err)
}
for i, coin := range coins {
coins[i], err = sdk.ConvertCoin(coin, app.BaseCoinUnit)
coins[i], err = sdk.ConvertCoin(coin, chain.BaseCoinUnit)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -175,17 +177,17 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) {
"app_state": map[string]interface{}{
"staking": map[string]interface{}{
"params": map[string]string{
"bond_denom": app.BaseCoinUnit,
"bond_denom": chain.BaseCoinUnit,
},
},
"gov": map[string]interface{}{
"deposit_params": map[string]interface{}{
"min_deposit": sdk.NewCoins(sdk.NewCoin(app.BaseCoinUnit, govtypes.DefaultMinDepositTokens)),
"min_deposit": sdk.NewCoins(sdk.NewCoin(chain.BaseCoinUnit, govtypes.DefaultMinDepositTokens)),
},
},
"mint": map[string]interface{}{
"params": map[string]string{
"mint_denom": app.BaseCoinUnit,
"mint_denom": chain.BaseCoinUnit,
},
},
"bank": map[string]interface{}{
Expand Down
10 changes: 5 additions & 5 deletions cmd/chain-maind/cmd/testnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"path/filepath"
"time"

"github.com/crypto-com/chain-main/app"
"github.com/spf13/cobra"
tmconfig "github.com/tendermint/tendermint/config"
"github.com/tendermint/tendermint/crypto"
Expand All @@ -37,6 +36,7 @@ import (
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
chain "github.com/crypto-com/chain-main/x/chainmain"
)

var (
Expand Down Expand Up @@ -383,22 +383,22 @@ func initGenFiles(

var stakingGenState stakingtypes.GenesisState
clientCtx.JSONMarshaler.MustUnmarshalJSON(appGenState[stakingtypes.ModuleName], &stakingGenState)
stakingGenState.Params.BondDenom = app.BaseCoinUnit
stakingGenState.Params.BondDenom = chain.BaseCoinUnit
stakingGenState.Params.UnbondingTime = unbondingTime

appGenState[stakingtypes.ModuleName] = clientCtx.JSONMarshaler.MustMarshalJSON(&stakingGenState)

// set gov min_deposit in the genesis state
var govGenState govtypes.GenesisState
clientCtx.JSONMarshaler.MustUnmarshalJSON(appGenState[govtypes.ModuleName], &govGenState)
govGenState.DepositParams.MinDeposit[0].Denom = app.BaseCoinUnit
govGenState.DepositParams.MinDeposit[0].Denom = chain.BaseCoinUnit
govGenState.DepositParams.MinDeposit[0].Amount = govtypes.DefaultMinDepositTokens
appGenState[govtypes.ModuleName] = clientCtx.JSONMarshaler.MustMarshalJSON(&govGenState)

// set mint in the genesis state
var mintGenState minttypes.GenesisState
clientCtx.JSONMarshaler.MustUnmarshalJSON(appGenState[minttypes.ModuleName], &mintGenState)
mintGenState.Params.MintDenom = app.BaseCoinUnit
mintGenState.Params.MintDenom = chain.BaseCoinUnit
appGenState[minttypes.ModuleName] = clientCtx.JSONMarshaler.MustMarshalJSON(&mintGenState)

// set the accounts in the genesis state
Expand Down Expand Up @@ -531,7 +531,7 @@ func writeFile(name string, dir string, contents []byte) error {

func parseStakingCoin(coins sdk.Coins, stakingAmount string) (sdk.Coin, error) {
stakingCoin := sdk.Coin{
Denom: app.BaseCoinUnit,
Denom: chain.BaseCoinUnit,
Amount: sdk.ZeroInt(),
}
if stakingAmount == "" {
Expand Down
89 changes: 86 additions & 3 deletions x/chainmain/module.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package chainmain

import (
"context"
"encoding/json"
"fmt"
"strings"

"github.com/gogo/protobuf/grpc"
"github.com/gorilla/mux"
Expand All @@ -12,10 +14,13 @@ import (
abci "github.com/tendermint/tendermint/abci/types"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/codec"
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/version"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/crypto-com/chain-main/x/chainmain/keeper"
"github.com/crypto-com/chain-main/x/chainmain/types"
)
Expand Down Expand Up @@ -67,17 +72,95 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler,
}

// RegisterRESTRoutes registers the capability module's REST service handlers.
func (a AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {}
func (a AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {

}

// RegisterGRPCRoutes registers the gRPC Gateway routes for the capability module.
func (a AppModuleBasic) RegisterGRPCRoutes(_ client.Context, _ *runtime.ServeMux) {
func (a AppModuleBasic) RegisterGRPCRoutes(clientCtx client.Context, mux *runtime.ServeMux) {

}

// GetTxCmd returns the capability module's root tx command.
func (a AppModuleBasic) GetTxCmd() *cobra.Command { return nil }

func GetBalancesCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "balances [address]",
Short: "Query for account balances by address",
Long: strings.TrimSpace(
fmt.Sprintf(`Query the total balance of an account or of a specific denomination.
Example:
$ %s query %s balances [address]
$ %s query %s balances [address] --denom=[denom]
`,
version.AppName, types.ModuleName, version.AppName, types.ModuleName,
),
),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx := client.GetClientContextFromCmd(cmd)
clientCtx, queryErr := client.ReadQueryCommandFlags(clientCtx, cmd.Flags())
clientCtx = clientCtx.WithNodeURI("http://localhost:26657")
if queryErr != nil {
return queryErr
}

denom := ""
queryClient := banktypes.NewQueryClient(clientCtx)

addr, addressErr := sdk.AccAddressFromBech32(args[0])
if addressErr != nil {
return addressErr
}

pageReq, clientErr := client.ReadPageRequest(cmd.Flags())
if clientErr != nil {
return clientErr
}
if denom == "" {
params := banktypes.NewQueryAllBalancesRequest(addr, pageReq)
res, allBalancesErr := queryClient.AllBalances(context.Background(), params)
basecro := res.Balances.AmountOf(BaseCoinUnit).Uint64()
carson := uint64(OneCroInCarson)
fmt.Printf("%d.%08d CRO (%d BASECRO)\n", basecro/carson, basecro%carson, basecro)
if allBalancesErr != nil {
return allBalancesErr
}
return nil
}

params := banktypes.NewQueryBalanceRequest(addr, denom)
res, balancesErr := queryClient.Balance(context.Background(), params)
if balancesErr != nil {
return balancesErr
}

return clientCtx.PrintOutput(res.Balance)
},
}

flags.AddPaginationFlagsToCmd(cmd, "all balances")

return cmd
}

// GetQueryCmd returns the capability module's root query command.
func (AppModuleBasic) GetQueryCmd() *cobra.Command { return nil }
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
cmd := &cobra.Command{
Use: types.ModuleName,
Short: "Querying commands for the chain module",
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}

cmd.AddCommand(
GetBalancesCmd(),
)
return cmd
}

// ----------------------------------------------------------------------------
// AppModule
Expand Down
19 changes: 19 additions & 0 deletions x/chainmain/prefix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package chainmain

const (
CoinType = 394
FundraiserPath = "44'/394'/0'/0/1"
)

var (
AccountAddressPrefix = "cro"
AccountPubKeyPrefix = "cropub"
ValidatorAddressPrefix = "crocncl"
ValidatorPubKeyPrefix = "crocnclpub"
ConsNodeAddressPrefix = "crocnclcons"
ConsNodePubKeyPrefix = "crocnclconspub"
HumanCoinUnit = "cro"
BaseCoinUnit = "basecro" // 10^-8 AKA "carson"
CroExponential = 8 // 10^8
OneCroInCarson = 1_0000_0000
)

0 comments on commit 0484a05

Please sign in to comment.