From c8c9d7317cfba113d7378afeac512d7fe0abe723 Mon Sep 17 00:00:00 2001 From: danwt <30197399+danwt@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:33:10 +0000 Subject: [PATCH 1/5] quick hacks --- x/rollapp/genesisbridge/ante_decorator.go | 14 +- .../genesisbridge/genesis_bridge_data.pb.go | 8 +- x/rollapp/genesisbridge/genesis_transfer.go | 2 +- x/rollapp/genesisbridge/ibc_module.go | 181 ++++++++++++++---- 4 files changed, 152 insertions(+), 53 deletions(-) diff --git a/x/rollapp/genesisbridge/ante_decorator.go b/x/rollapp/genesisbridge/ante_decorator.go index 4c6db9f2e..236730af8 100644 --- a/x/rollapp/genesisbridge/ante_decorator.go +++ b/x/rollapp/genesisbridge/ante_decorator.go @@ -16,7 +16,7 @@ type ChannelKeeper interface { GetChannelClientState(ctx sdk.Context, portID, channelID string) (string, exported.ClientState, error) // implemented by ibc channel keeper } -// TransferEnabledDecorator only allows ibc transfers to a rollapp if that rollapp has finished +// TransferEnabledDecorator only allows ibc transfers to a hub if that hub has finished // the genesis bridge protocol. type TransferEnabledDecorator struct { rollappK RollappKeeperMinimal @@ -35,21 +35,21 @@ func (h TransferEnabledDecorator) transfersEnabled(ctx sdk.Context, transfer *tr if err != nil { if errorsmod.IsOf(err, types.ErrRollappNotFound) { // Two cases - // 1. Non rollapp + // 1. Non hub // Transfers are enabled - // 2. It is for rollapp but the light client of this transfer is not yet canonical or will never - // be marked canonical: for a correct rollapp the transfer channel is only created after it's + // 2. It is for hub but the light client of this transfer is not yet canonical or will never + // be marked canonical: for a correct hub the transfer channel is only created after it's // marked canonical, so this transfer corresponds to a not-relevant channel. // Note: IBC prevents sending to a channel which is not OPEN, which prevents making the transfer // for a channel before it is marked canonical in the onOpenAck hook. return true, nil } - return false, errorsmod.Wrap(err, "rollapp by port chan") + return false, errorsmod.Wrap(err, "hub by port chan") } return ra.GenesisState.TransfersEnabled, nil } -// AnteHandle will return an error if the tx contains an ibc transfer message to a rollapp that has not finished the transfer genesis protocol. +// AnteHandle will return an error if the tx contains an ibc transfer message to a hub that has not finished the transfer genesis protocol. func (h TransferEnabledDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { for _, msg := range tx.GetMsgs() { typeURL := sdk.MsgTypeURL(msg) @@ -63,7 +63,7 @@ func (h TransferEnabledDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat return ctx, errorsmod.Wrap(err, "transfer genesis: transfers enabled") } if !ok { - return ctx, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "transfers to/from rollapp are disabled") + return ctx, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "transfers to/from hub are disabled") } } } diff --git a/x/rollapp/genesisbridge/genesis_bridge_data.pb.go b/x/rollapp/genesisbridge/genesis_bridge_data.pb.go index 6956ad872..8fbfb5787 100644 --- a/x/rollapp/genesisbridge/genesis_bridge_data.pb.go +++ b/x/rollapp/genesisbridge/genesis_bridge_data.pb.go @@ -30,9 +30,9 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisBridgeData is the data struct that is passed to the hub for the // genesis bridge flow type GenesisBridgeData struct { - // genesis_info is the genesis info of the rollapp. used for hub validation + // genesis_info is the genesis info of the hub. used for hub validation GenesisInfo GenesisBridgeInfo `protobuf:"bytes,1,opt,name=genesis_info,json=genesisInfo,proto3" json:"genesis_info"` - // native_denom is the native denom of the rollapp. registered on the hub + // native_denom is the native denom of the hub. registered on the hub NativeDenom types.Metadata `protobuf:"bytes,2,opt,name=native_denom,json=nativeDenom,proto3" json:"native_denom"` // optional genesis transfer packet data GenesisTransfer *types1.FungibleTokenPacketData `protobuf:"bytes,3,opt,name=genesis_transfer,json=genesisTransfer,proto3" json:"genesis_transfer,omitempty"` @@ -92,8 +92,8 @@ func (m *GenesisBridgeData) GetGenesisTransfer() *types1.FungibleTokenPacketData return nil } -// The genesis info of the rollapp, that is passed to the hub for validation. -// it's populated on the InitGenesis of the rollapp +// The genesis info of the hub, that is passed to the hub for validation. +// it's populated on the InitGenesis of the hub type GenesisBridgeInfo struct { // checksum used to verify integrity of the genesis file. currently unused GenesisChecksum string `protobuf:"bytes,1,opt,name=genesis_checksum,json=genesisChecksum,proto3" json:"genesis_checksum,omitempty"` diff --git a/x/rollapp/genesisbridge/genesis_transfer.go b/x/rollapp/genesisbridge/genesis_transfer.go index 0a439a453..97fd5b458 100644 --- a/x/rollapp/genesisbridge/genesis_transfer.go +++ b/x/rollapp/genesisbridge/genesis_transfer.go @@ -11,7 +11,7 @@ import ( ) const ( - // HubRecipient is the address of `x/rollapp` module's account on the hub chain. + // HubRecipient is the address of `x/hub` module's account on the hub chain. HubRecipient = "dym1mk7pw34ypusacm29m92zshgxee3yreums8avur" ) diff --git a/x/rollapp/genesisbridge/ibc_module.go b/x/rollapp/genesisbridge/ibc_module.go index 20e9d5814..28e5a349b 100644 --- a/x/rollapp/genesisbridge/ibc_module.go +++ b/x/rollapp/genesisbridge/ibc_module.go @@ -10,6 +10,7 @@ import ( "github.com/cometbft/cometbft/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" @@ -24,11 +25,11 @@ import ( // IBCModule GenesisBridge is responsible for handling the genesis bridge protocol. // (ADR: https://www.notion.so/dymension/ADR-x-Genesis-Bridge-109a4a51f86a80ba8b50db454bee04a7?pvs=4) // -// It validated the genesis info registered on the hub, is the same as the rollapp's genesis info. +// It validated the genesis info registered on the hub, is the same as the hub's genesis info. // It registers the denom metadata for the native denom. // It handles the genesis transfer. // -// Before the genesis bridge protocol completes, no transfers are allowed to the rollapp. +// Before the genesis bridge protocol completes, no transfers are allowed to the hub. // The Hub will block transfers Hub->RA to enforce this. // // Important: it is now WRONG to open an ibc connection in the Rollapp->Hub direction. @@ -67,33 +68,33 @@ func (w IBCModule) logger( } // OnRecvPacket will handle the genesis bridge packet in case needed. -// no-op for non-rollapp chains and rollapps with transfers enabled. +// no-op for non-hub chains and rollapps with transfers enabled. // -// The genesis bridge packet is a special packet that is sent from the rollapp to the hub on channel creation. +// The genesis bridge packet is a special packet that is sent from the hub to the hub on channel creation. // The hub will receive this packet and: -// - validated the genesis info registered on the hub, is the same as the rollapp's genesis info. +// - validated the genesis info registered on the hub, is the same as the hub's genesis info. // - registers the denom metadata for the native denom. // - handles the genesis transfer. -// On success, it will mark the IBC channel for this rollapp as enabled. This marks the end of the genesis phase. +// On success, it will mark the IBC channel for this hub as enabled. This marks the end of the genesis phase. // -// NOTE: we assume that by this point the canonical channel ID has already been set for the rollapp, in a secure way. +// NOTE: we assume that by this point the canonical channel ID has already been set for the hub, in a secure way. func (w IBCModule) OnRecvPacket( ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress, ) exported.Acknowledgement { - // Get rollapp from the packet + // Get hub from the packet // we don't use the commonly used GetValidTransfer because we have custom type for genesis bridge ra, err := w.rollappKeeper.GetRollappByPortChan(ctx, packet.GetDestPort(), packet.GetDestChannel()) if errorsmod.IsOf(err, types.ErrRollappNotFound) { - // no problem, it corresponds to a regular non-rollapp chain + // no problem, it corresponds to a regular non-hub chain return w.IBCModule.OnRecvPacket(ctx, packet, relayer) } if err != nil { - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "get rollapp id")) + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "get hub id")) } - // skip the genesis bridge if the rollapp already has transfers enabled + // skip the genesis bridge if the hub already has transfers enabled if ra.IsTransferEnabled() { return w.IBCModule.OnRecvPacket(ctx, packet, relayer) } @@ -113,7 +114,7 @@ func (w IBCModule) OnRecvPacket( return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "validate basic genesis bridge data")) } - // validate genesis info against the expected data set on the rollapp + // validate genesis info against the expected data set on the hub err = w.ValidateGenesisBridge(ra, genesisBridgeData.GenesisInfo) if err != nil { l.Error("Validate genesis info.", "err", err) @@ -151,33 +152,6 @@ func (w IBCModule) OnRecvPacket( return successAck } -func (w IBCModule) ValidateGenesisBridge(ra *types.Rollapp, data GenesisBridgeInfo) error { - raInfo := ra.GenesisInfo - - if data.GenesisChecksum != raInfo.GenesisChecksum { - return fmt.Errorf("genesis checksum mismatch: expected: %v, got: %v", raInfo.GenesisChecksum, data.GenesisChecksum) - } - - if data.Bech32Prefix != raInfo.Bech32Prefix { - return fmt.Errorf("bech32 prefix mismatch: expected: %v, got: %v", raInfo.Bech32Prefix, data.Bech32Prefix) - } - - if data.NativeDenom != raInfo.NativeDenom { - return fmt.Errorf("native denom mismatch: expected: %v, got: %v", raInfo.NativeDenom, data.NativeDenom) - } - - if !data.InitialSupply.Equal(raInfo.InitialSupply) { - return fmt.Errorf("initial supply mismatch: expected: %v, got: %v", raInfo.InitialSupply, data.InitialSupply) - } - - err := compareGenesisAccounts(raInfo.GenesisAccounts, data.GenesisAccounts) - if err != nil { - return errorsmod.Wrap(err, "genesis accounts mismatch") - } - - return nil -} - func compareGenesisAccounts(raCommitted *types.GenesisAccounts, gbData []types.GenesisAccount) error { if raCommitted == nil { if len(gbData) == 0 { @@ -210,7 +184,7 @@ func (w IBCModule) registerDenomMetadata(ctx sdk.Context, rollappID, channelID s // Change the base to the ibc denom, and add an alias to the original m.Base = trace.IBCDenom() - m.Description = fmt.Sprintf("auto-generated ibc denom for rollapp: base: %s: rollapp: %s", m.GetBase(), rollappID) + m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), rollappID) for i, u := range m.DenomUnits { if u.Exponent == 0 { m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) @@ -232,7 +206,7 @@ func (w IBCModule) registerDenomMetadata(ctx sdk.Context, rollappID, channelID s } // EnableTransfers marks the end of the genesis bridge phase. -// It sets the transfers enabled flag on the rollapp. +// It sets the transfers enabled flag on the hub. // It also calls the after transfers enabled hook. func (w IBCModule) EnableTransfers(ctx sdk.Context, ra *types.Rollapp, rollappIBCtrace string) error { ra.GenesisState.TransfersEnabled = true @@ -247,3 +221,128 @@ func (w IBCModule) EnableTransfers(ctx sdk.Context, ra *types.Rollapp, rollappIB return nil } + +type genesisTransferValidator struct { + args struct { + rollapp GenesisBridgeData // what the rollapp sent over IBC + hub types.GenesisInfo // what the hub thinks is correct + channelID string // can use "channel-0" in simulation + rollappID string // the actual rollapp ID + } +} + +type GenesisTransferExecData struct { + trace transfertypes.DenomTrace + bankMeta banktypes.Metadata + fungiDatas []transfertypes.FungibleTokenPacketData +} + +func (e *genesisTransferValidator) validateAndGetActionableData() (*GenesisTransferExecData, error) { + if err := e.args.rollapp.ValidateBasic(); err != nil { + return nil, errorsmod.Wrap(err, "validate basic genesis bridge data") + } + + if err := e.validateAgainstHub(e.args.rollapp.GenesisInfo, e.args.hub); err != nil { + return nil, errorsmod.Wrap(err, "validate against hub") + } + + ret := &GenesisTransferExecData{} + trace, bankMeta, err := e.getBankStuff() + if err != nil { + return nil, errorsmod.Wrap(err, "get bank stuff") + } + ret.trace = *trace + ret.bankMeta = *bankMeta + + fungiDatas, err := e.getFungiData() + if err != nil { + return nil, errorsmod.Wrap(err, "get fungi data") + } + ret.fungiDatas = fungiDatas + return ret, nil +} + +func (e *genesisTransferValidator) validateAgainstHub(packet GenesisBridgeInfo, hub types.GenesisInfo) error { + if packet.GenesisChecksum != hub.GenesisChecksum { + return fmt.Errorf("genesis checksum mismatch: expected: %v, got: %v", hub.GenesisChecksum, packet.GenesisChecksum) + } + + if packet.Bech32Prefix != hub.Bech32Prefix { + return fmt.Errorf("bech32 prefix mismatch: expected: %v, got: %v", hub.Bech32Prefix, packet.Bech32Prefix) + } + + if packet.NativeDenom != hub.NativeDenom { + return fmt.Errorf("native denom mismatch: expected: %v, got: %v", hub.NativeDenom, packet.NativeDenom) + } + + if !packet.InitialSupply.Equal(hub.InitialSupply) { + return fmt.Errorf("initial supply mismatch: expected: %v, got: %v", hub.InitialSupply, packet.InitialSupply) + } + + err := compareGenesisAccounts(hub.GenesisAccounts, packet.GenesisAccounts) + if err != nil { + return errorsmod.Wrap(err, "genesis accounts mismatch") + } +} + +func (e *genesisTransferValidator) getBankStuff() (*transfertypes.DenomTrace, *banktypes.Metadata, error) { + var m banktypes.Metadata + m = e.args.rollapp.NativeDenom + trace := uibc.GetForeignDenomTrace(e.args.channelID, m.Base) + + // Change the base to the ibc denom, and add an alias to the original + m.Base = trace.IBCDenom() + m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), e.args.rollappID) + for i, u := range m.DenomUnits { + if u.Exponent == 0 { + m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) + m.DenomUnits[i].Denom = m.GetBase() + } + } + + if err := m.Validate(); err != nil { + return nil, nil, errorsmod.Wrap(errors.Join(gerrc.ErrInvalidArgument, err), "metadata validate") + } + return &trace, &m, nil +} + +func (e *genesisTransferValidator) getFungiData() ([]transfertypes.FungibleTokenPacketData, error) { + gTransfer := e.args.rollapp.GenesisTransfer + required := e.args.hub.GenesisAccounts != nil + // required but not present + if required && gTransfer == nil { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer required") + } + // not required but present + if !required && gTransfer != nil { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer not expected") + } + if gTransfer == nil { + return nil, nil + } + + // validate the receiver + if gTransfer.Receiver != HubRecipient { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "receiver mismatch") + } + + // validate that the transfer amount matches the expected amount, which is the sum of all genesis accounts + expectedAmount := e.args.hub.GenesisTransferAmount() + if expectedAmount.String() != gTransfer.Amount { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "amount mismatch") + } + + var ret []transfertypes.FungibleTokenPacketData + for _, acc := range e.args.hub.GenesisAccounts.Accounts { + // create a new packet for each account + data := transfertypes.NewFungibleTokenPacketData( + gTransfer.Denom, + acc.Amount.String(), + gTransfer.Sender, + acc.Address, + "", + ) + ret = append(ret, data) + } + return ret, nil +} From 534c556f22cdf7676fe415a47f04ebeb3f09eb33 Mon Sep 17 00:00:00 2001 From: danwt <30197399+danwt@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:36:59 +0000 Subject: [PATCH 2/5] cp --- x/rollapp/genesisbridge/ibc_module.go | 96 ++++++++------------------- 1 file changed, 28 insertions(+), 68 deletions(-) diff --git a/x/rollapp/genesisbridge/ibc_module.go b/x/rollapp/genesisbridge/ibc_module.go index 28e5a349b..6e3cab23b 100644 --- a/x/rollapp/genesisbridge/ibc_module.go +++ b/x/rollapp/genesisbridge/ibc_module.go @@ -108,34 +108,24 @@ func (w IBCModule) OnRecvPacket( return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "unmarshal genesis bridge data")) } - // stateless validation of the genesis bridge data - if err := genesisBridgeData.ValidateBasic(); err != nil { - l.Error("Validate basic genesis bridge data.", "err", err) - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "validate basic genesis bridge data")) + v := genesisTransferValidator{ + rollapp: genesisBridgeData, + hub: ra.GenesisInfo, + channelID: ra.ChannelId, + rollappID: ra.RollappId, } - // validate genesis info against the expected data set on the hub - err = w.ValidateGenesisBridge(ra, genesisBridgeData.GenesisInfo) + actionableData, err := v.validateAndGetActionableData() if err != nil { - l.Error("Validate genesis info.", "err", err) - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "validate genesis info")) + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "validate and get actionable data")) } - // register the denom metadata. the supplied denom is validated on validateBasic - raBaseDenom, err := w.registerDenomMetadata(ctx, ra.RollappId, ra.ChannelId, genesisBridgeData.NativeDenom) - if err != nil { - l.Error("Register denom metadata.", "err", err) - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "transfer genesis: register denom metadata")) - } - - // validate and handle the genesis transfer - err = w.handleGenesisTransfer(ctx, *ra, packet, genesisBridgeData.GenesisTransfer) - if err != nil { - l.Error("Handle genesis transfer.", "err", err) - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "handle genesis transfer")) + w.transferKeeper.SetDenomTrace(ctx, actionableData.trace) + if err := w.denomKeeper.CreateDenomMetadata(ctx, actionableData.bankMeta); err != nil { + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "create denom metadata")) } - err = w.EnableTransfers(ctx, ra, raBaseDenom) + err = w.EnableTransfers(ctx, ra, actionableData.bankMeta.Base) if err != nil { l.Error("Enable transfers.", "err", err) return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "transfer genesis: enable transfers")) @@ -143,7 +133,7 @@ func (w IBCModule) OnRecvPacket( ctx.EventManager().EmitEvent(sdk.NewEvent(types.EventTypeTransfersEnabled, sdk.NewAttribute(types.AttributeKeyRollappId, ra.RollappId), - sdk.NewAttribute(types.AttributeRollappIBCdenom, raBaseDenom), + sdk.NewAttribute(types.AttributeRollappIBCdenom, actionableData.bankMeta.Base), )) // return success ack @@ -177,34 +167,6 @@ func compareGenesisAccounts(raCommitted *types.GenesisAccounts, gbData []types.G return nil } -func (w IBCModule) registerDenomMetadata(ctx sdk.Context, rollappID, channelID string, m banktypes.Metadata) (string, error) { - // Set the trace for the ibc denom - trace := uibc.GetForeignDenomTrace(channelID, m.Base) - w.transferKeeper.SetDenomTrace(ctx, trace) - - // Change the base to the ibc denom, and add an alias to the original - m.Base = trace.IBCDenom() - m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), rollappID) - for i, u := range m.DenomUnits { - if u.Exponent == 0 { - m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) - m.DenomUnits[i].Denom = m.GetBase() - } - } - - if err := m.Validate(); err != nil { - return "", errorsmod.Wrap(errors.Join(gerrc.ErrInvalidArgument, err), "metadata validate") - } - - // We go by the denom keeper instead of calling bank directly, so denom creation hooks are called - err := w.denomKeeper.CreateDenomMetadata(ctx, m) - if err != nil { - return "", errorsmod.Wrap(err, "create denom metadata") - } - - return m.Base, nil -} - // EnableTransfers marks the end of the genesis bridge phase. // It sets the transfers enabled flag on the hub. // It also calls the after transfers enabled hook. @@ -223,30 +185,28 @@ func (w IBCModule) EnableTransfers(ctx sdk.Context, ra *types.Rollapp, rollappIB } type genesisTransferValidator struct { - args struct { - rollapp GenesisBridgeData // what the rollapp sent over IBC - hub types.GenesisInfo // what the hub thinks is correct - channelID string // can use "channel-0" in simulation - rollappID string // the actual rollapp ID - } + rollapp GenesisBridgeData // what the rollapp sent over IBC + hub types.GenesisInfo // what the hub thinks is correct + channelID string // can use "channel-0" in simulation + rollappID string // the actual rollapp ID } -type GenesisTransferExecData struct { +type genesisTransferActionableData struct { trace transfertypes.DenomTrace bankMeta banktypes.Metadata fungiDatas []transfertypes.FungibleTokenPacketData } -func (e *genesisTransferValidator) validateAndGetActionableData() (*GenesisTransferExecData, error) { - if err := e.args.rollapp.ValidateBasic(); err != nil { +func (e *genesisTransferValidator) validateAndGetActionableData() (*genesisTransferActionableData, error) { + if err := e.rollapp.ValidateBasic(); err != nil { return nil, errorsmod.Wrap(err, "validate basic genesis bridge data") } - if err := e.validateAgainstHub(e.args.rollapp.GenesisInfo, e.args.hub); err != nil { + if err := e.validateAgainstHub(e.rollapp.GenesisInfo, e.hub); err != nil { return nil, errorsmod.Wrap(err, "validate against hub") } - ret := &GenesisTransferExecData{} + ret := &genesisTransferActionableData{} trace, bankMeta, err := e.getBankStuff() if err != nil { return nil, errorsmod.Wrap(err, "get bank stuff") @@ -287,12 +247,12 @@ func (e *genesisTransferValidator) validateAgainstHub(packet GenesisBridgeInfo, func (e *genesisTransferValidator) getBankStuff() (*transfertypes.DenomTrace, *banktypes.Metadata, error) { var m banktypes.Metadata - m = e.args.rollapp.NativeDenom - trace := uibc.GetForeignDenomTrace(e.args.channelID, m.Base) + m = e.rollapp.NativeDenom + trace := uibc.GetForeignDenomTrace(e.channelID, m.Base) // Change the base to the ibc denom, and add an alias to the original m.Base = trace.IBCDenom() - m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), e.args.rollappID) + m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), e.rollappID) for i, u := range m.DenomUnits { if u.Exponent == 0 { m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) @@ -307,8 +267,8 @@ func (e *genesisTransferValidator) getBankStuff() (*transfertypes.DenomTrace, *b } func (e *genesisTransferValidator) getFungiData() ([]transfertypes.FungibleTokenPacketData, error) { - gTransfer := e.args.rollapp.GenesisTransfer - required := e.args.hub.GenesisAccounts != nil + gTransfer := e.rollapp.GenesisTransfer + required := e.hub.GenesisAccounts != nil // required but not present if required && gTransfer == nil { return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer required") @@ -327,13 +287,13 @@ func (e *genesisTransferValidator) getFungiData() ([]transfertypes.FungibleToken } // validate that the transfer amount matches the expected amount, which is the sum of all genesis accounts - expectedAmount := e.args.hub.GenesisTransferAmount() + expectedAmount := e.hub.GenesisTransferAmount() if expectedAmount.String() != gTransfer.Amount { return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "amount mismatch") } var ret []transfertypes.FungibleTokenPacketData - for _, acc := range e.args.hub.GenesisAccounts.Accounts { + for _, acc := range e.hub.GenesisAccounts.Accounts { // create a new packet for each account data := transfertypes.NewFungibleTokenPacketData( gTransfer.Denom, From c1b0eec2cf55db5eb82f69be1a51c1136d79eb6e Mon Sep 17 00:00:00 2001 From: danwt <30197399+danwt@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:41:48 +0000 Subject: [PATCH 3/5] demo is ready --- x/rollapp/genesisbridge/genesis_transfer.go | 66 ------- x/rollapp/genesisbridge/ibc_module.go | 182 +++----------------- x/rollapp/genesisbridge/validator.go | 162 +++++++++++++++++ 3 files changed, 182 insertions(+), 228 deletions(-) delete mode 100644 x/rollapp/genesisbridge/genesis_transfer.go create mode 100644 x/rollapp/genesisbridge/validator.go diff --git a/x/rollapp/genesisbridge/genesis_transfer.go b/x/rollapp/genesisbridge/genesis_transfer.go deleted file mode 100644 index 97fd5b458..000000000 --- a/x/rollapp/genesisbridge/genesis_transfer.go +++ /dev/null @@ -1,66 +0,0 @@ -package genesisbridge - -import ( - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" - - "github.com/dymensionxyz/dymension/v3/x/rollapp/types" - gerrc "github.com/dymensionxyz/gerr-cosmos/gerrc" -) - -const ( - // HubRecipient is the address of `x/hub` module's account on the hub chain. - HubRecipient = "dym1mk7pw34ypusacm29m92zshgxee3yreums8avur" -) - -// HandleGenesisTransfer handles the genesis transfer packet, if present, and expected. -// We assume that genesis info is already validated, and the genesis transfer is expected to fulfill the genesis info. -func (w IBCModule) handleGenesisTransfer(ctx sdk.Context, ra types.Rollapp, packet channeltypes.Packet, gTransfer *transfertypes.FungibleTokenPacketData) error { - // check if required or expected - required := ra.GenesisInfo.GenesisAccounts != nil - // required but not present - if required && gTransfer == nil { - return errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer required") - } - // not required but present - if !required && gTransfer != nil { - return errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer not expected") - } - if gTransfer == nil { - return nil - } - - // validate the receiver - if gTransfer.Receiver != HubRecipient { - return errorsmod.Wrap(gerrc.ErrFailedPrecondition, "receiver mismatch") - } - - // validate that the transfer amount matches the expected amount, which is the sum of all genesis accounts - expectedAmount := ra.GenesisInfo.GenesisTransferAmount() - if expectedAmount.String() != gTransfer.Amount { - return errorsmod.Wrap(gerrc.ErrFailedPrecondition, "amount mismatch") - } - - // split the transfer to the genesis accounts - for _, acc := range ra.GenesisInfo.GenesisAccounts.Accounts { - // create a new packet for each account - data := transfertypes.NewFungibleTokenPacketData( - gTransfer.Denom, - acc.Amount.String(), - gTransfer.Sender, - acc.Address, - "", - ) - - // mint and send tokens to the account - // No event emitted, as we called the transfer keeper directly (vs the transfer middleware stack) - err := w.transferKeeper.OnRecvPacket(ctx, packet, data) - if err != nil { - return errorsmod.Wrapf(err, "on receive packet: %s", acc.Address) - } - } - - return nil -} diff --git a/x/rollapp/genesisbridge/ibc_module.go b/x/rollapp/genesisbridge/ibc_module.go index 6e3cab23b..63ec3f692 100644 --- a/x/rollapp/genesisbridge/ibc_module.go +++ b/x/rollapp/genesisbridge/ibc_module.go @@ -2,24 +2,21 @@ package genesisbridge import ( "encoding/json" - "errors" - "fmt" - "slices" errorsmod "cosmossdk.io/errors" "github.com/cometbft/cometbft/libs/log" sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" - "github.com/dymensionxyz/gerr-cosmos/gerrc" + "github.com/dymensionxyz/dymension/v3/x/rollapp/types" "github.com/dymensionxyz/sdk-utils/utils/uevent" - "github.com/dymensionxyz/sdk-utils/utils/uibc" +) - "github.com/dymensionxyz/dymension/v3/x/rollapp/types" +const ( + // HubRecipient is the address of `x/hub` module's account on the hub chain. + HubRecipient = "dym1mk7pw34ypusacm29m92zshgxee3yreums8avur" ) // IBCModule GenesisBridge is responsible for handling the genesis bridge protocol. @@ -108,24 +105,33 @@ func (w IBCModule) OnRecvPacket( return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "unmarshal genesis bridge data")) } - v := genesisTransferValidator{ + v := validator{ rollapp: genesisBridgeData, hub: ra.GenesisInfo, channelID: ra.ChannelId, rollappID: ra.RollappId, } - actionableData, err := v.validateAndGetActionableData() + actionItems, err := v.validateAndGetActionItems() if err != nil { return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "validate and get actionable data")) } - w.transferKeeper.SetDenomTrace(ctx, actionableData.trace) - if err := w.denomKeeper.CreateDenomMetadata(ctx, actionableData.bankMeta); err != nil { + w.transferKeeper.SetDenomTrace(ctx, actionItems.trace) + if err := w.denomKeeper.CreateDenomMetadata(ctx, actionItems.bankMeta); err != nil { return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "create denom metadata")) } - err = w.EnableTransfers(ctx, ra, actionableData.bankMeta.Base) + if err := w.transferKeeper.OnRecvPacket(ctx, packet, actionItems.fungiDatas[0]); err != nil { + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "handle genesis transfer")) + } + for _, data := range actionItems.fungiDatas { + if err := w.transferKeeper.OnRecvPacket(ctx, packet, data); err != nil { + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "handle genesis transfer")) + } + } + + err = w.EnableTransfers(ctx, ra, actionItems.bankMeta.Base) if err != nil { l.Error("Enable transfers.", "err", err) return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "transfer genesis: enable transfers")) @@ -133,7 +139,7 @@ func (w IBCModule) OnRecvPacket( ctx.EventManager().EmitEvent(sdk.NewEvent(types.EventTypeTransfersEnabled, sdk.NewAttribute(types.AttributeKeyRollappId, ra.RollappId), - sdk.NewAttribute(types.AttributeRollappIBCdenom, actionableData.bankMeta.Base), + sdk.NewAttribute(types.AttributeRollappIBCdenom, actionItems.bankMeta.Base), )) // return success ack @@ -142,31 +148,6 @@ func (w IBCModule) OnRecvPacket( return successAck } -func compareGenesisAccounts(raCommitted *types.GenesisAccounts, gbData []types.GenesisAccount) error { - if raCommitted == nil { - if len(gbData) == 0 { - return nil - } - return fmt.Errorf("genesis accounts length mismatch: expected 0, got %d", len(gbData)) - } - - if len(raCommitted.Accounts) != len(gbData) { - return fmt.Errorf("genesis accounts length mismatch: expected %d, got %d", len(raCommitted.Accounts), len(gbData)) - } - - for _, acc := range raCommitted.Accounts { - found := slices.ContainsFunc(gbData, func(dataAcc types.GenesisAccount) bool { - return dataAcc.Address == acc.Address && dataAcc.Amount.Equal(acc.Amount) - }) - - if !found { - return fmt.Errorf("genesis account mismatch: account %s with amount %v not found in data", acc.Address, acc.Amount) - } - } - - return nil -} - // EnableTransfers marks the end of the genesis bridge phase. // It sets the transfers enabled flag on the hub. // It also calls the after transfers enabled hook. @@ -183,126 +164,3 @@ func (w IBCModule) EnableTransfers(ctx sdk.Context, ra *types.Rollapp, rollappIB return nil } - -type genesisTransferValidator struct { - rollapp GenesisBridgeData // what the rollapp sent over IBC - hub types.GenesisInfo // what the hub thinks is correct - channelID string // can use "channel-0" in simulation - rollappID string // the actual rollapp ID -} - -type genesisTransferActionableData struct { - trace transfertypes.DenomTrace - bankMeta banktypes.Metadata - fungiDatas []transfertypes.FungibleTokenPacketData -} - -func (e *genesisTransferValidator) validateAndGetActionableData() (*genesisTransferActionableData, error) { - if err := e.rollapp.ValidateBasic(); err != nil { - return nil, errorsmod.Wrap(err, "validate basic genesis bridge data") - } - - if err := e.validateAgainstHub(e.rollapp.GenesisInfo, e.hub); err != nil { - return nil, errorsmod.Wrap(err, "validate against hub") - } - - ret := &genesisTransferActionableData{} - trace, bankMeta, err := e.getBankStuff() - if err != nil { - return nil, errorsmod.Wrap(err, "get bank stuff") - } - ret.trace = *trace - ret.bankMeta = *bankMeta - - fungiDatas, err := e.getFungiData() - if err != nil { - return nil, errorsmod.Wrap(err, "get fungi data") - } - ret.fungiDatas = fungiDatas - return ret, nil -} - -func (e *genesisTransferValidator) validateAgainstHub(packet GenesisBridgeInfo, hub types.GenesisInfo) error { - if packet.GenesisChecksum != hub.GenesisChecksum { - return fmt.Errorf("genesis checksum mismatch: expected: %v, got: %v", hub.GenesisChecksum, packet.GenesisChecksum) - } - - if packet.Bech32Prefix != hub.Bech32Prefix { - return fmt.Errorf("bech32 prefix mismatch: expected: %v, got: %v", hub.Bech32Prefix, packet.Bech32Prefix) - } - - if packet.NativeDenom != hub.NativeDenom { - return fmt.Errorf("native denom mismatch: expected: %v, got: %v", hub.NativeDenom, packet.NativeDenom) - } - - if !packet.InitialSupply.Equal(hub.InitialSupply) { - return fmt.Errorf("initial supply mismatch: expected: %v, got: %v", hub.InitialSupply, packet.InitialSupply) - } - - err := compareGenesisAccounts(hub.GenesisAccounts, packet.GenesisAccounts) - if err != nil { - return errorsmod.Wrap(err, "genesis accounts mismatch") - } -} - -func (e *genesisTransferValidator) getBankStuff() (*transfertypes.DenomTrace, *banktypes.Metadata, error) { - var m banktypes.Metadata - m = e.rollapp.NativeDenom - trace := uibc.GetForeignDenomTrace(e.channelID, m.Base) - - // Change the base to the ibc denom, and add an alias to the original - m.Base = trace.IBCDenom() - m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), e.rollappID) - for i, u := range m.DenomUnits { - if u.Exponent == 0 { - m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) - m.DenomUnits[i].Denom = m.GetBase() - } - } - - if err := m.Validate(); err != nil { - return nil, nil, errorsmod.Wrap(errors.Join(gerrc.ErrInvalidArgument, err), "metadata validate") - } - return &trace, &m, nil -} - -func (e *genesisTransferValidator) getFungiData() ([]transfertypes.FungibleTokenPacketData, error) { - gTransfer := e.rollapp.GenesisTransfer - required := e.hub.GenesisAccounts != nil - // required but not present - if required && gTransfer == nil { - return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer required") - } - // not required but present - if !required && gTransfer != nil { - return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer not expected") - } - if gTransfer == nil { - return nil, nil - } - - // validate the receiver - if gTransfer.Receiver != HubRecipient { - return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "receiver mismatch") - } - - // validate that the transfer amount matches the expected amount, which is the sum of all genesis accounts - expectedAmount := e.hub.GenesisTransferAmount() - if expectedAmount.String() != gTransfer.Amount { - return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "amount mismatch") - } - - var ret []transfertypes.FungibleTokenPacketData - for _, acc := range e.hub.GenesisAccounts.Accounts { - // create a new packet for each account - data := transfertypes.NewFungibleTokenPacketData( - gTransfer.Denom, - acc.Amount.String(), - gTransfer.Sender, - acc.Address, - "", - ) - ret = append(ret, data) - } - return ret, nil -} diff --git a/x/rollapp/genesisbridge/validator.go b/x/rollapp/genesisbridge/validator.go new file mode 100644 index 000000000..0de8ebc7f --- /dev/null +++ b/x/rollapp/genesisbridge/validator.go @@ -0,0 +1,162 @@ +package genesisbridge + +import ( + "errors" + "fmt" + + errorsmod "cosmossdk.io/errors" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/dymensionxyz/dymension/v3/x/rollapp/types" + "github.com/dymensionxyz/gerr-cosmos/gerrc" + "github.com/dymensionxyz/sdk-utils/utils/uibc" +) + +type validator struct { + rollapp GenesisBridgeData // what the rollapp sent over IBC + hub types.GenesisInfo // what the hub thinks is correct + channelID string // can use "channel-0" in simulation + rollappID string // the actual rollapp ID +} + +type actionItems struct { + trace transfertypes.DenomTrace + bankMeta banktypes.Metadata + fungiDatas []transfertypes.FungibleTokenPacketData +} + +func (v *validator) validateAndGetActionItems() (*actionItems, error) { + if err := v.rollapp.ValidateBasic(); err != nil { + return nil, errorsmod.Wrap(err, "validate basic genesis bridge data") + } + + if err := v.validateAgainstHub(v.rollapp.GenesisInfo, v.hub); err != nil { + return nil, errorsmod.Wrap(err, "validate against hub") + } + + ret := &actionItems{} + trace, bankMeta, err := v.getBankStuff() + if err != nil { + return nil, errorsmod.Wrap(err, "get bank stuff") + } + ret.trace = *trace + ret.bankMeta = *bankMeta + + fungiDatas, err := v.getFungiData() + if err != nil { + return nil, errorsmod.Wrap(err, "get fungi data") + } + ret.fungiDatas = fungiDatas + return ret, nil +} + +func (v *validator) validateAgainstHub(packet GenesisBridgeInfo, hub types.GenesisInfo) error { + if packet.GenesisChecksum != hub.GenesisChecksum { + return fmt.Errorf("genesis checksum mismatch: expected: %v, got: %v", hub.GenesisChecksum, packet.GenesisChecksum) + } + + if packet.Bech32Prefix != hub.Bech32Prefix { + return fmt.Errorf("bech32 prefix mismatch: expected: %v, got: %v", hub.Bech32Prefix, packet.Bech32Prefix) + } + + if packet.NativeDenom != hub.NativeDenom { + return fmt.Errorf("native denom mismatch: expected: %v, got: %v", hub.NativeDenom, packet.NativeDenom) + } + + if !packet.InitialSupply.Equal(hub.InitialSupply) { + return fmt.Errorf("initial supply mismatch: expected: %v, got: %v", hub.InitialSupply, packet.InitialSupply) + } + + err := compareGenesisAccounts(hub.GenesisAccounts, packet.GenesisAccounts) + if err != nil { + return errorsmod.Wrap(err, "genesis accounts mismatch") + } + return nil +} + +func compareGenesisAccounts(raCommitted *types.GenesisAccounts, gbData []types.GenesisAccount) error { + if raCommitted == nil { + if len(gbData) == 0 { + return nil + } + return fmt.Errorf("genesis accounts length mismatch: expected 0, got %d", len(gbData)) + } + + if len(raCommitted.Accounts) != len(gbData) { + return fmt.Errorf("genesis accounts length mismatch: expected %d, got %d", len(raCommitted.Accounts), len(gbData)) + } + + for _, acc := range raCommitted.Accounts { + found := slices.ContainsFunc(gbData, func(dataAcc types.GenesisAccount) bool { + return dataAcc.Address == acc.Address && dataAcc.Amount.Equal(acc.Amount) + }) + + if !found { + return fmt.Errorf("genesis account mismatch: account %s with amount %v not found in data", acc.Address, acc.Amount) + } + } + + return nil +} + +func (v *validator) getBankStuff() (*transfertypes.DenomTrace, *banktypes.Metadata, error) { + var m banktypes.Metadata + m = v.rollapp.NativeDenom + trace := uibc.GetForeignDenomTrace(v.channelID, m.Base) + + // Change the base to the ibc denom, and add an alias to the original + m.Base = trace.IBCDenom() + m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), v.rollappID) + for i, u := range m.DenomUnits { + if u.Exponent == 0 { + m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) + m.DenomUnits[i].Denom = m.GetBase() + } + } + + if err := m.Validate(); err != nil { + return nil, nil, errorsmod.Wrap(errors.Join(gerrc.ErrInvalidArgument, err), "metadata validate") + } + return &trace, &m, nil +} + +func (v *validator) getFungiData() ([]transfertypes.FungibleTokenPacketData, error) { + gTransfer := v.rollapp.GenesisTransfer + required := v.hub.GenesisAccounts != nil + // required but not present + if required && gTransfer == nil { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer required") + } + // not required but present + if !required && gTransfer != nil { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "genesis transfer not expected") + } + if gTransfer == nil { + return nil, nil + } + + // validate the receiver + if gTransfer.Receiver != HubRecipient { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "receiver mismatch") + } + + // validate that the transfer amount matches the expected amount, which is the sum of all genesis accounts + expectedAmount := v.hub.GenesisTransferAmount() + if expectedAmount.String() != gTransfer.Amount { + return nil, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "amount mismatch") + } + + var ret []transfertypes.FungibleTokenPacketData + for _, acc := range v.hub.GenesisAccounts.Accounts { + // create a new packet for each account + data := transfertypes.NewFungibleTokenPacketData( + gTransfer.Denom, + acc.Amount.String(), + gTransfer.Sender, + acc.Address, + "", + ) + ret = append(ret, data) + } + return ret, nil +} From 2fa6c1e3c3b7edadaaa78af7385514fd7b1b50c5 Mon Sep 17 00:00:00 2001 From: danwt <30197399+danwt@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:43:34 +0000 Subject: [PATCH 4/5] see if we can fix the rename --- x/rollapp/genesisbridge/ante_decorator.go | 14 +++++----- .../genesisbridge/genesis_bridge_data.pb.go | 10 +++---- x/rollapp/genesisbridge/ibc_module.go | 28 +++++++++---------- x/rollapp/genesisbridge/validator.go | 6 ++-- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/x/rollapp/genesisbridge/ante_decorator.go b/x/rollapp/genesisbridge/ante_decorator.go index 236730af8..4c6db9f2e 100644 --- a/x/rollapp/genesisbridge/ante_decorator.go +++ b/x/rollapp/genesisbridge/ante_decorator.go @@ -16,7 +16,7 @@ type ChannelKeeper interface { GetChannelClientState(ctx sdk.Context, portID, channelID string) (string, exported.ClientState, error) // implemented by ibc channel keeper } -// TransferEnabledDecorator only allows ibc transfers to a hub if that hub has finished +// TransferEnabledDecorator only allows ibc transfers to a rollapp if that rollapp has finished // the genesis bridge protocol. type TransferEnabledDecorator struct { rollappK RollappKeeperMinimal @@ -35,21 +35,21 @@ func (h TransferEnabledDecorator) transfersEnabled(ctx sdk.Context, transfer *tr if err != nil { if errorsmod.IsOf(err, types.ErrRollappNotFound) { // Two cases - // 1. Non hub + // 1. Non rollapp // Transfers are enabled - // 2. It is for hub but the light client of this transfer is not yet canonical or will never - // be marked canonical: for a correct hub the transfer channel is only created after it's + // 2. It is for rollapp but the light client of this transfer is not yet canonical or will never + // be marked canonical: for a correct rollapp the transfer channel is only created after it's // marked canonical, so this transfer corresponds to a not-relevant channel. // Note: IBC prevents sending to a channel which is not OPEN, which prevents making the transfer // for a channel before it is marked canonical in the onOpenAck hook. return true, nil } - return false, errorsmod.Wrap(err, "hub by port chan") + return false, errorsmod.Wrap(err, "rollapp by port chan") } return ra.GenesisState.TransfersEnabled, nil } -// AnteHandle will return an error if the tx contains an ibc transfer message to a hub that has not finished the transfer genesis protocol. +// AnteHandle will return an error if the tx contains an ibc transfer message to a rollapp that has not finished the transfer genesis protocol. func (h TransferEnabledDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { for _, msg := range tx.GetMsgs() { typeURL := sdk.MsgTypeURL(msg) @@ -63,7 +63,7 @@ func (h TransferEnabledDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat return ctx, errorsmod.Wrap(err, "transfer genesis: transfers enabled") } if !ok { - return ctx, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "transfers to/from hub are disabled") + return ctx, errorsmod.Wrap(gerrc.ErrFailedPrecondition, "transfers to/from rollapp are disabled") } } } diff --git a/x/rollapp/genesisbridge/genesis_bridge_data.pb.go b/x/rollapp/genesisbridge/genesis_bridge_data.pb.go index 8fbfb5787..c3bc97f0d 100644 --- a/x/rollapp/genesisbridge/genesis_bridge_data.pb.go +++ b/x/rollapp/genesisbridge/genesis_bridge_data.pb.go @@ -27,12 +27,12 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// GenesisBridgeData is the data struct that is passed to the hub for the +// GenesisBridgeData is the data struct that is passed to the rollapp for the // genesis bridge flow type GenesisBridgeData struct { - // genesis_info is the genesis info of the hub. used for hub validation + // genesis_info is the genesis info of the rollapp. used for rollapp validation GenesisInfo GenesisBridgeInfo `protobuf:"bytes,1,opt,name=genesis_info,json=genesisInfo,proto3" json:"genesis_info"` - // native_denom is the native denom of the hub. registered on the hub + // native_denom is the native denom of the rollapp. registered on the rollapp NativeDenom types.Metadata `protobuf:"bytes,2,opt,name=native_denom,json=nativeDenom,proto3" json:"native_denom"` // optional genesis transfer packet data GenesisTransfer *types1.FungibleTokenPacketData `protobuf:"bytes,3,opt,name=genesis_transfer,json=genesisTransfer,proto3" json:"genesis_transfer,omitempty"` @@ -92,8 +92,8 @@ func (m *GenesisBridgeData) GetGenesisTransfer() *types1.FungibleTokenPacketData return nil } -// The genesis info of the hub, that is passed to the hub for validation. -// it's populated on the InitGenesis of the hub +// The genesis info of the rollapp, that is passed to the rollapp for validation. +// it's populated on the InitGenesis of the rollapp type GenesisBridgeInfo struct { // checksum used to verify integrity of the genesis file. currently unused GenesisChecksum string `protobuf:"bytes,1,opt,name=genesis_checksum,json=genesisChecksum,proto3" json:"genesis_checksum,omitempty"` diff --git a/x/rollapp/genesisbridge/ibc_module.go b/x/rollapp/genesisbridge/ibc_module.go index 63ec3f692..624ff6024 100644 --- a/x/rollapp/genesisbridge/ibc_module.go +++ b/x/rollapp/genesisbridge/ibc_module.go @@ -15,18 +15,18 @@ import ( ) const ( - // HubRecipient is the address of `x/hub` module's account on the hub chain. + // HubRecipient is the address of `x/rollapp` module's account on the rollapp chain. HubRecipient = "dym1mk7pw34ypusacm29m92zshgxee3yreums8avur" ) // IBCModule GenesisBridge is responsible for handling the genesis bridge protocol. // (ADR: https://www.notion.so/dymension/ADR-x-Genesis-Bridge-109a4a51f86a80ba8b50db454bee04a7?pvs=4) // -// It validated the genesis info registered on the hub, is the same as the hub's genesis info. +// It validated the genesis info registered on the rollapp, is the same as the rollapp's genesis info. // It registers the denom metadata for the native denom. // It handles the genesis transfer. // -// Before the genesis bridge protocol completes, no transfers are allowed to the hub. +// Before the genesis bridge protocol completes, no transfers are allowed to the rollapp. // The Hub will block transfers Hub->RA to enforce this. // // Important: it is now WRONG to open an ibc connection in the Rollapp->Hub direction. @@ -65,33 +65,33 @@ func (w IBCModule) logger( } // OnRecvPacket will handle the genesis bridge packet in case needed. -// no-op for non-hub chains and rollapps with transfers enabled. +// no-op for non-rollapp chains and rollapps with transfers enabled. // -// The genesis bridge packet is a special packet that is sent from the hub to the hub on channel creation. -// The hub will receive this packet and: -// - validated the genesis info registered on the hub, is the same as the hub's genesis info. +// The genesis bridge packet is a special packet that is sent from the rollapp to the rollapp on channel creation. +// The rollapp will receive this packet and: +// - validated the genesis info registered on the rollapp, is the same as the rollapp's genesis info. // - registers the denom metadata for the native denom. // - handles the genesis transfer. -// On success, it will mark the IBC channel for this hub as enabled. This marks the end of the genesis phase. +// On success, it will mark the IBC channel for this rollapp as enabled. This marks the end of the genesis phase. // -// NOTE: we assume that by this point the canonical channel ID has already been set for the hub, in a secure way. +// NOTE: we assume that by this point the canonical channel ID has already been set for the rollapp, in a secure way. func (w IBCModule) OnRecvPacket( ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress, ) exported.Acknowledgement { - // Get hub from the packet + // Get rollapp from the packet // we don't use the commonly used GetValidTransfer because we have custom type for genesis bridge ra, err := w.rollappKeeper.GetRollappByPortChan(ctx, packet.GetDestPort(), packet.GetDestChannel()) if errorsmod.IsOf(err, types.ErrRollappNotFound) { - // no problem, it corresponds to a regular non-hub chain + // no problem, it corresponds to a regular non-rollapp chain return w.IBCModule.OnRecvPacket(ctx, packet, relayer) } if err != nil { - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "get hub id")) + return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "get rollapp id")) } - // skip the genesis bridge if the hub already has transfers enabled + // skip the genesis bridge if the rollapp already has transfers enabled if ra.IsTransferEnabled() { return w.IBCModule.OnRecvPacket(ctx, packet, relayer) } @@ -149,7 +149,7 @@ func (w IBCModule) OnRecvPacket( } // EnableTransfers marks the end of the genesis bridge phase. -// It sets the transfers enabled flag on the hub. +// It sets the transfers enabled flag on the rollapp. // It also calls the after transfers enabled hook. func (w IBCModule) EnableTransfers(ctx sdk.Context, ra *types.Rollapp, rollappIBCtrace string) error { ra.GenesisState.TransfersEnabled = true diff --git a/x/rollapp/genesisbridge/validator.go b/x/rollapp/genesisbridge/validator.go index 0de8ebc7f..e38ffeef3 100644 --- a/x/rollapp/genesisbridge/validator.go +++ b/x/rollapp/genesisbridge/validator.go @@ -14,7 +14,7 @@ import ( type validator struct { rollapp GenesisBridgeData // what the rollapp sent over IBC - hub types.GenesisInfo // what the hub thinks is correct + hub types.GenesisInfo // what the rollapp thinks is correct channelID string // can use "channel-0" in simulation rollappID string // the actual rollapp ID } @@ -31,7 +31,7 @@ func (v *validator) validateAndGetActionItems() (*actionItems, error) { } if err := v.validateAgainstHub(v.rollapp.GenesisInfo, v.hub); err != nil { - return nil, errorsmod.Wrap(err, "validate against hub") + return nil, errorsmod.Wrap(err, "validate against rollapp") } ret := &actionItems{} @@ -106,7 +106,7 @@ func (v *validator) getBankStuff() (*transfertypes.DenomTrace, *banktypes.Metada // Change the base to the ibc denom, and add an alias to the original m.Base = trace.IBCDenom() - m.Description = fmt.Sprintf("auto-generated ibc denom for hub: base: %s: hub: %s", m.GetBase(), v.rollappID) + m.Description = fmt.Sprintf("auto-generated ibc denom for rollapp: base: %s: rollapp: %s", m.GetBase(), v.rollappID) for i, u := range m.DenomUnits { if u.Exponent == 0 { m.DenomUnits[i].Aliases = append(m.DenomUnits[i].Aliases, u.Denom) From 7e087eced2340378468e2df46f0726c5f14dcbeb Mon Sep 17 00:00:00 2001 From: danwt <30197399+danwt@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:45:52 +0000 Subject: [PATCH 5/5] remove dupe --- x/rollapp/genesisbridge/ibc_module.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/x/rollapp/genesisbridge/ibc_module.go b/x/rollapp/genesisbridge/ibc_module.go index 624ff6024..9e076b1ee 100644 --- a/x/rollapp/genesisbridge/ibc_module.go +++ b/x/rollapp/genesisbridge/ibc_module.go @@ -122,9 +122,6 @@ func (w IBCModule) OnRecvPacket( return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "create denom metadata")) } - if err := w.transferKeeper.OnRecvPacket(ctx, packet, actionItems.fungiDatas[0]); err != nil { - return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "handle genesis transfer")) - } for _, data := range actionItems.fungiDatas { if err := w.transferKeeper.OnRecvPacket(ctx, packet, data); err != nil { return uevent.NewErrorAcknowledgement(ctx, errorsmod.Wrap(err, "handle genesis transfer"))