Skip to content

Commit

Permalink
Merge branch 'main' into feature/use-osmosis-15p2p1
Browse files Browse the repository at this point in the history
  • Loading branch information
danwt authored Mar 20, 2024
2 parents 70bc823 + 657138c commit 4f21efb
Show file tree
Hide file tree
Showing 9 changed files with 551 additions and 103 deletions.
2 changes: 1 addition & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -743,7 +743,7 @@ func New(
var transferStack ibcporttypes.IBCModule
transferStack = ibctransfer.NewIBCModule(app.TransferKeeper)
transferStack = packetforwardmiddleware.NewIBCMiddleware(transferStack, app.PacketForwardMiddlewareKeeper, 0, packetforwardkeeper.DefaultForwardTransferPacketTimeoutTimestamp, packetforwardkeeper.DefaultRefundTransferPacketTimeoutTimestamp)
transferStack = denommetadatamodule.NewIBCMiddleware(transferStack, app.IBCKeeper.ChannelKeeper, app.TransferKeeper, app.RollappKeeper, app.BankKeeper)
transferStack = denommetadatamodule.NewIBCMiddleware(transferStack, app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, app.TransferKeeper, app.RollappKeeper)
transferStack = delayedackmodule.NewIBCMiddleware(transferStack, app.DelayedAckKeeper)

// Create static IBC router, add transfer route, then set and seal it
Expand Down
128 changes: 86 additions & 42 deletions ibctesting/rollapp_genesis_token_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
"github.com/dymensionxyz/dymension/v3/app/apptesting"
"github.com/dymensionxyz/dymension/v3/utils"
rollappkeeper "github.com/dymensionxyz/dymension/v3/x/rollapp/keeper"
Expand Down Expand Up @@ -47,117 +46,152 @@ func (suite *RollappGenesisTokenTestSuite) TestTriggerGenesisEvent() {
suite.coordinator.Setup(hubToCosmosPath)

cases := []struct {
name string
gensisState *types.RollappGenesisState
msg *types.MsgRollappGenesisEvent
deployerParams []types.DeployerParams
expErr error
name string
gensisState *types.RollappGenesisState
msg *types.MsgRollappGenesisEvent
deployerParams []types.DeployerParams
expectSavedDenomMetaData bool
expErr string
}{
{
"successful rollapp genesis event",
&types.RollappGenesisState{
name: "successful rollapp genesis event",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: false,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: hubToRollappPath.EndpointA.ChannelID,
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
nil,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: true,
expErr: "",
},
{
"invalid rollapp genesis event - genesis event already triggered",
&types.RollappGenesisState{
name: "invalid rollapp genesis event - genesis event already triggered",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: true,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: hubToRollappPath.EndpointA.ChannelID,
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
types.ErrGenesisEventAlreadyTriggered,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: types.ErrGenesisEventAlreadyTriggered.Error(),
},
{
"invalid rollapp genesis event - unauthorized address",
&types.RollappGenesisState{
name: "invalid rollapp genesis event - unauthorized address",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: true,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: apptesting.CreateRandomAccounts(1)[0].String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: hubToRollappPath.EndpointA.ChannelID,
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
sdkerrors.ErrUnauthorized,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: sdkerrors.ErrUnauthorized.Error(),
},
{
"invalid rollapp genesis event - rollapp doesn't exist",
&types.RollappGenesisState{
name: "invalid rollapp genesis event - rollapp doesn't exist",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: false,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: "someRandomChainID",
ChannelId: hubToRollappPath.EndpointA.ChannelID,
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
types.ErrUnknownRollappID,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: types.ErrUnknownRollappID.Error(),
},
{
"invalid rollapp genesis event - channel doesn't exist",
&types.RollappGenesisState{
name: "invalid rollapp genesis event - channel doesn't exist",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: false,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: "SomeRandomChannelID",
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
channeltypes.ErrChannelNotFound,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: "port-id: transfer, channel-id: SomeRandomChannelID: channel not found",
},
{
"invalid rollapp genesis event - channel id doesn't match chain id",
&types.RollappGenesisState{
name: "invalid rollapp genesis event - channel id doesn't match chain id",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(350))},
{Address: apptesting.CreateRandomAccounts(1)[0].String(), Amount: sdk.NewCoin(rollappDenom, sdk.NewInt(140))},
},
IsGenesisEvent: false,
},
&types.MsgRollappGenesisEvent{
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: hubToCosmosPath.EndpointA.ChannelID,
},
[]types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
types.ErrInvalidGenesisChannelId,
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: "channel channel-1 is connected to chain ID evmos_9000-2, expected evmos_9000-3: invalid genesis channel id",
},
{
name: "failed rollapp genesis event - error minting coins",
gensisState: &types.RollappGenesisState{
GenesisAccounts: []types.GenesisAccount{
{Address: ""},
},
IsGenesisEvent: false,
},
msg: &types.MsgRollappGenesisEvent{
Address: genesisAuthorizedAccount.String(),
RollappId: suite.rollappChain.ChainID,
ChannelId: hubToRollappPath.EndpointA.ChannelID,
},
deployerParams: []types.DeployerParams{{Address: genesisAuthorizedAccount.String()}},
expectSavedDenomMetaData: false,
expErr: "empty address string is not allowed",
},
}
for _, tc := range cases {
suite.Run(fmt.Sprintf("Case %s", tc.name), func() {
// Reset the test state
defer func() {
suite.SetupTest()
suite.CreateRollapp()
// Create a primary path
hubToRollappPath = suite.NewTransferPath(suite.hubChain, suite.rollappChain)
suite.coordinator.Setup(hubToRollappPath)
// Create a secondary path with a 3rd party chain
hubToCosmosPath = suite.NewTransferPath(suite.hubChain, suite.cosmosChain)
suite.coordinator.Setup(hubToCosmosPath)
}()
// Setup the deployer whitelist
rollappKeeper := ConvertToApp(suite.hubChain).RollappKeeper
rollappKeeper.SetParams(suite.ctx, types.NewParams(true, 2, tc.deployerParams))
Expand All @@ -169,7 +203,9 @@ func (suite *RollappGenesisTokenTestSuite) TestTriggerGenesisEvent() {
// Send the genesis event
_, err := suite.msgServer.TriggerGenesisEvent(suite.ctx, tc.msg)
suite.hubChain.NextBlock()
suite.Require().ErrorIs(err, tc.expErr)
if tc.expErr != "" {
suite.Require().EqualError(err, tc.expErr)
}
// Validate no tokens are in the module account
accountKeeper := ConvertToApp(suite.hubChain).AccountKeeper
bankKeeper := ConvertToApp(suite.hubChain).BankKeeper
Expand All @@ -178,11 +214,19 @@ func (suite *RollappGenesisTokenTestSuite) TestTriggerGenesisEvent() {
// Validate the genesis accounts balances
rollappIBCDenom := utils.GetForeignIBCDenom(hubToRollappPath.EndpointB.ChannelID, rollappDenom)
for _, roallppGenesisAccount := range tc.gensisState.GenesisAccounts {
balance := bankKeeper.GetBalance(suite.ctx, sdk.MustAccAddressFromBech32(roallppGenesisAccount.Address), rollappIBCDenom)
if tc.expErr != nil {
suite.Require().Equal(sdk.NewCoin(rollappIBCDenom, sdk.NewInt(0)), balance)
} else {
suite.Require().Equal(roallppGenesisAccount.Amount.Amount, balance.Amount)
if roallppGenesisAccount.Address != "" {
balance := bankKeeper.GetBalance(suite.ctx, sdk.MustAccAddressFromBech32(roallppGenesisAccount.Address), rollappIBCDenom)
if tc.expErr != "" {
suite.Require().Equal(sdk.NewCoin(rollappIBCDenom, sdk.NewInt(0)), balance)
} else {
suite.Require().Equal(roallppGenesisAccount.Amount.Amount, balance.Amount)
}
}

denomMetaData, found := bankKeeper.GetDenomMetaData(suite.ctx, rollappIBCDenom)
suite.Require().Equal(tc.expectSavedDenomMetaData, found)
if tc.expectSavedDenomMetaData {
suite.Require().Equal(rollappDenom, denomMetaData.Display)
}
}
})
Expand Down
15 changes: 14 additions & 1 deletion ibctesting/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,20 @@ func (suite *IBCTestUtilSuite) CreateRollapp() {
suite.rollappChain.ChainID,
10,
[]string{},
nil,
[]rollapptypes.TokenMetadata{
{
Name: "RollApp RAX",
Symbol: "rax",
Description: "The native staking token of RollApp XYZ",
DenomUnits: []*rollapptypes.DenomUnit{
{Denom: "arax", Exponent: uint32(0), Aliases: nil},
{Denom: "mrax", Exponent: uint32(3), Aliases: []string{"millirax"}},
{Denom: "urax", Exponent: uint32(6), Aliases: []string{"microrax"}},
},
Base: "arax",
Display: "arax",
},
},
nil,
)
_, err := suite.hubChain.SendMsgs(msgCreateRollapp)
Expand Down
6 changes: 5 additions & 1 deletion testutil/sample/sample.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@ import (

// AccAddress returns a sample account address
func AccAddress() string {
return Acc().String()
}

func Acc() sdk.AccAddress {
pk := ed25519.GenPrivKey().PubKey()
addr := pk.Address()
return sdk.AccAddress(addr).String()
return sdk.AccAddress(addr)
}

// GenerateAddresses generates numOfAddresses bech32 address
Expand Down
68 changes: 15 additions & 53 deletions x/denommetadata/ibc_middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,13 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
ibctypes "github.com/cosmos/ibc-go/v6/modules/light-clients/07-tendermint/types"

bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
transferkeeper "github.com/cosmos/ibc-go/v6/modules/apps/transfer/keeper"
transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
porttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types"
"github.com/cosmos/ibc-go/v6/modules/core/exported"
"github.com/dymensionxyz/dymension/v3/x/denommetadata/types"
rollappkeeper "github.com/dymensionxyz/dymension/v3/x/rollapp/keeper"

ibctypes "github.com/cosmos/ibc-go/v6/modules/light-clients/07-tendermint/types"
)

var _ porttypes.Middleware = &IBCMiddleware{}
Expand All @@ -27,17 +22,22 @@ type IBCMiddleware struct {
ics4Wrapper porttypes.ICS4Wrapper
transferkeeper types.TransferKeeper
rollappkeeper types.RollappKeeper
bankkeeper types.BankKeeper
}

// NewIBCMiddleware creates a new IBCMiddleware given the keeper and underlying application
func NewIBCMiddleware(app porttypes.IBCModule, ck types.ChannelKeeper, tk transferkeeper.Keeper, rk rollappkeeper.Keeper, bk bankkeeper.Keeper) IBCMiddleware {
func NewIBCMiddleware(
app porttypes.IBCModule,
ck types.ChannelKeeper,
iw porttypes.ICS4Wrapper,
tk types.TransferKeeper,
rk types.RollappKeeper,
) IBCMiddleware {
return IBCMiddleware{
app: app,
channelKeeper: ck,
ics4Wrapper: iw,
transferkeeper: tk,
rollappkeeper: rk,
bankkeeper: bk,
}
}

Expand Down Expand Up @@ -116,14 +116,16 @@ func (im IBCMiddleware) OnRecvPacket(
packet channeltypes.Packet,
relayer sdk.AccAddress,
) exported.Acknowledgement {
logger := ctx.Logger().With("module", "DenomMiddleware")

if !im.rollappkeeper.GetParams(ctx).RollappsEnabled {
logger.Debug("Skipping IBC transfer OnRecvPacket for rollapps not enabled")
return im.app.OnRecvPacket(ctx, packet, relayer)
}

logger := ctx.Logger().With("module", "DenomMiddleware")

var data transfertypes.FungibleTokenPacketData
if err := transfertypes.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil {
logger.Error("failed to unmarshal fungible token packet data", "err", err)
return channeltypes.NewErrorAcknowledgement(err)
}

Expand Down Expand Up @@ -163,51 +165,11 @@ func (im IBCMiddleware) OnRecvPacket(

// no-op if token already exist
if im.transferkeeper.HasDenomTrace(ctx, traceHash) {
logger.Debug("Skipping denommetadata middleware. Denom trace already exists", "denom", prefixedDenom)
return im.app.OnRecvPacket(ctx, packet, relayer)
}

if len(rollapp.TokenMetadata) == 0 {
logger.Info("skipping new IBC token for rollapp with no metadata", "rollappID", chainID, "denom", voucherDenom)
return im.app.OnRecvPacket(ctx, packet, relayer)
}

if im.bankkeeper.HasDenomMetaData(ctx, voucherDenom) {
logger.Info("denom metadata already registered", "rollappID", chainID, "denom", voucherDenom)
return im.app.OnRecvPacket(ctx, packet, relayer)
}

for i := range rollapp.TokenMetadata {
if rollapp.TokenMetadata[i].Base == data.Denom {
metadata := banktypes.Metadata{
Description: "auto-generated metadata for " + voucherDenom + " from rollapp " + chainID,
Base: voucherDenom,
DenomUnits: make([]*banktypes.DenomUnit, len(rollapp.TokenMetadata[i].DenomUnits)),
Display: rollapp.TokenMetadata[i].Display,
Name: rollapp.TokenMetadata[i].Name,
Symbol: rollapp.TokenMetadata[i].Symbol,
URI: rollapp.TokenMetadata[i].URI,
URIHash: rollapp.TokenMetadata[i].URIHash,
}
// Copy DenomUnits slice
for j, du := range rollapp.TokenMetadata[i].DenomUnits {
newDu := banktypes.DenomUnit{
Aliases: du.Aliases,
Denom: du.Denom,
Exponent: du.Exponent,
}
// base denom_unit should be the same as baseDenom
if newDu.Exponent == 0 {
newDu.Denom = voucherDenom
newDu.Aliases = append(newDu.Aliases, du.Denom)
}
metadata.DenomUnits[j] = &newDu
}

im.bankkeeper.SetDenomMetaData(ctx, metadata)

logger.Info("registered denom metadata for IBC token", "rollappID", chainID, "denom", voucherDenom)
}
}
im.rollappkeeper.RegisterDenomMetadata(ctx, rollapp, voucherDenom, data.Denom)

return im.app.OnRecvPacket(ctx, packet, relayer)
}
Expand Down
Loading

0 comments on commit 4f21efb

Please sign in to comment.