Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(denommetadata): Add support for providing denom-trace and creation of multiple denom-metadatas #384

Merged
merged 6 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions proto/denommetadata/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ message MsgCreateDenomMetadata {
string sender_address = 1;
cosmos.bank.v1beta1.Metadata token_metadata = 2
[ (gogoproto.nullable) = false ];
string denom_trace = 3;
}

// MsgCreateDenomMetadataResponse defines the MsgCreateDenomMetadata response
Expand Down
31 changes: 16 additions & 15 deletions testutil/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,20 +346,6 @@ func NewRollapp(
),
)

app.DenommetadataKeeper = denommetadatakeeper.NewKeeper(
appCodec,
keys[denommetadatatypes.StoreKey],
app.BankKeeper,
nil,
app.GetSubspace(denommetadatatypes.ModuleName),
)
// set hook for denom metadata keeper later
app.DenommetadataKeeper.SetHooks(
denommetadatatypes.NewMultiDenommetadataHooks(
// insert denom metadata hooks receivers here
),
)

app.DistrKeeper = distrkeeper.NewKeeper(
appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper,
&stakingKeeper, &app.SequencersKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(),
Expand Down Expand Up @@ -428,6 +414,21 @@ func NewRollapp(
)
transferIBCModule := ibctransfer.NewIBCModule(app.TransferKeeper)

app.DenommetadataKeeper = denommetadatakeeper.NewKeeper(
appCodec,
keys[denommetadatatypes.StoreKey],
app.BankKeeper,
app.TransferKeeper,
nil,
app.GetSubspace(denommetadatatypes.ModuleName),
)
// set hook for denom metadata keeper later
app.DenommetadataKeeper.SetHooks(
denommetadatatypes.NewMultiDenommetadataHooks(
// insert denom metadata hooks receivers here
),
)

app.HubGenesisKeeper = hubgenkeeper.NewKeeper(
appCodec,
keys[hubgentypes.StoreKey],
Expand Down Expand Up @@ -536,12 +537,12 @@ func NewRollapp(
vestingtypes.ModuleName,
govtypes.ModuleName,
minttypes.ModuleName,
denommetadatatypes.ModuleName,
ibchost.ModuleName,
genutiltypes.ModuleName,
paramstypes.ModuleName,
upgradetypes.ModuleName,
ibctransfertypes.ModuleName,
denommetadatatypes.ModuleName,
hubgentypes.ModuleName,
}
app.mm.SetOrderInitGenesis(initGenesisList...)
Expand Down
18 changes: 18 additions & 0 deletions x/denommetadata/client/cli/flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package cli

import (
flag "github.com/spf13/pflag"
)

const (
// Set denom trace flags
FlagDenomTrace = "denom-trace"
)

// FlagSetCreateDenomMetadata returns flags for creating denommetadata.
func FlagSetCreateDenomMetadata() *flag.FlagSet {
fs := flag.NewFlagSet("", flag.ContinueOnError)

fs.String(FlagDenomTrace, "", "denom trace for the ibc denom")
return fs
}
17 changes: 17 additions & 0 deletions x/denommetadata/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cli

import (
"encoding/json"
"fmt"
"os"

"github.com/spf13/cobra"
Expand All @@ -10,6 +11,7 @@ import (
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"

"github.com/dymensionxyz/dymension-rdk/x/denommetadata/types"
)
Expand Down Expand Up @@ -63,9 +65,23 @@ func NewCmdCreateDenomMetadata() *cobra.Command {
return err
}

// Parse denom trace
trace, err := cmd.Flags().GetString(FlagDenomTrace)
if err != nil {
return fmt.Errorf("denom trace must be string: %v", err)
}
if trace != "" {
denomTrace := transfertypes.ParseDenomTrace(trace)
denom := denomTrace.IBCDenom()
if denom != metadata.Base {
return fmt.Errorf("denom %s parse from denom trace does not match metadata base denom %s", denom, metadata.Base)
}
}

msg := &types.MsgCreateDenomMetadata{
SenderAddress: sender.String(),
TokenMetadata: metadata,
DenomTrace: trace,
}

if err := msg.ValidateBasic(); err != nil {
Expand All @@ -76,6 +92,7 @@ func NewCmdCreateDenomMetadata() *cobra.Command {
},
}

cmd.Flags().AddFlagSet(FlagSetCreateDenomMetadata())
flags.AddTxFlagsToCmd(cmd)
return cmd
}
Expand Down
17 changes: 10 additions & 7 deletions x/denommetadata/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@ type Keeper struct {
cdc codec.BinaryCodec
paramSpace paramtypes.Subspace

bankKeeper types.BankKeeper
hooks types.MultiDenomMetadataHooks
bankKeeper types.BankKeeper
transferKeeper types.TransferKeeper
hooks types.MultiDenomMetadataHooks
}

// NewKeeper creates new instances of the Keeper
func NewKeeper(
cdc codec.BinaryCodec,
storeKey storetypes.StoreKey,
bk types.BankKeeper,
tk types.TransferKeeper,
hooks types.MultiDenomMetadataHooks,
paramSpace paramtypes.Subspace,
) Keeper {
Expand All @@ -33,11 +35,12 @@ func NewKeeper(
}

return Keeper{
storeKey: storeKey,
cdc: cdc,
paramSpace: paramSpace,
bankKeeper: bk,
hooks: hooks,
storeKey: storeKey,
cdc: cdc,
paramSpace: paramSpace,
bankKeeper: bk,
transferKeeper: tk,
hooks: hooks,
}
}

Expand Down
9 changes: 9 additions & 0 deletions x/denommetadata/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"

"github.com/dymensionxyz/dymension-rdk/x/denommetadata/types"
)
Expand Down Expand Up @@ -48,6 +49,14 @@ func (k msgServer) CreateDenomMetadata(
return nil, fmt.Errorf("error in after denom metadata creation hook: %w", err)
}

// construct the denomination trace from the full raw denomination
denomTrace := transfertypes.ParseDenomTrace(msg.DenomTrace)

traceHash := denomTrace.Hash()
if !k.transferKeeper.HasDenomTrace(ctx, traceHash) {
k.transferKeeper.SetDenomTrace(ctx, denomTrace)
}

return &types.MsgCreateDenomMetadataResponse{}, nil
}

Expand Down
14 changes: 11 additions & 3 deletions x/denommetadata/types/expected_keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,20 @@ package types

import (
sdk "github.com/cosmos/cosmos-sdk/types"
types "github.com/cosmos/cosmos-sdk/x/bank/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
tmbytes "github.com/tendermint/tendermint/libs/bytes"
)

// BankKeeper defines the expected interface needed to retrieve account balances.
type BankKeeper interface {
GetDenomMetaData(ctx sdk.Context, denom string) (types.Metadata, bool)
GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool)
HasDenomMetaData(ctx sdk.Context, denom string) bool
SetDenomMetaData(ctx sdk.Context, denomMetaData types.Metadata)
SetDenomMetaData(ctx sdk.Context, denomMetaData banktypes.Metadata)
}

// TransferKeeper defines the expected interface needed to set denom trace.
type TransferKeeper interface {
HasDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) bool
SetDenomTrace(ctx sdk.Context, denomTrace transfertypes.DenomTrace)
}
89 changes: 71 additions & 18 deletions x/denommetadata/types/tx.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading