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: adding RegisteredPayees to ics29 genesis state #1492

Merged
merged 16 commits into from
Jun 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
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
19 changes: 19 additions & 0 deletions docs/ibc/proto-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
- [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel)
- [ForwardRelayerAddress](#ibc.applications.fee.v1.ForwardRelayerAddress)
- [GenesisState](#ibc.applications.fee.v1.GenesisState)
- [RegisteredPayee](#ibc.applications.fee.v1.RegisteredPayee)
- [RegisteredRelayerAddress](#ibc.applications.fee.v1.RegisteredRelayerAddress)

- [ibc/applications/fee/v1/metadata.proto](#ibc/applications/fee/v1/metadata.proto)
Expand Down Expand Up @@ -844,6 +845,7 @@ GenesisState defines the ICS29 fee middleware genesis state
| ----- | ---- | ----- | ----------- |
| `identified_fees` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | repeated | list of identified packet fees |
| `fee_enabled_channels` | [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel) | repeated | list of fee enabled channels |
| `registered_payees` | [RegisteredPayee](#ibc.applications.fee.v1.RegisteredPayee) | repeated | list of registered payees |
| `registered_relayers` | [RegisteredRelayerAddress](#ibc.applications.fee.v1.RegisteredRelayerAddress) | repeated | list of registered relayer addresses |
| `forward_relayers` | [ForwardRelayerAddress](#ibc.applications.fee.v1.ForwardRelayerAddress) | repeated | list of forward relayer addresses |

Expand All @@ -852,6 +854,23 @@ GenesisState defines the ICS29 fee middleware genesis state



<a name="ibc.applications.fee.v1.RegisteredPayee"></a>

### RegisteredPayee
RegisteredPayee contains the relayer address and payee address for a specific channel


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `relayer_address` | [string](#string) | | the relayer address |
| `payee` | [string](#string) | | the payee address |
| `channel_id` | [string](#string) | | unique channel identifier |






<a name="ibc.applications.fee.v1.RegisteredRelayerAddress"></a>

### RegisteredRelayerAddress
Expand Down
5 changes: 5 additions & 0 deletions modules/apps/29-fee/keeper/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) {
for _, enabledChan := range state.FeeEnabledChannels {
k.SetFeeEnabled(ctx, enabledChan.PortId, enabledChan.ChannelId)
}

for _, registeredPayee := range state.RegisteredPayees {
k.SetPayeeAddress(ctx, registeredPayee.RelayerAddress, registeredPayee.Payee, registeredPayee.ChannelId)
}
}

// ExportGenesis returns the fee middleware application exported genesis
Expand All @@ -32,5 +36,6 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
FeeEnabledChannels: k.GetAllFeeEnabledChannels(ctx),
RegisteredRelayers: k.GetAllRelayerAddresses(ctx),
ForwardRelayers: k.GetAllForwardRelayerAddresses(ctx),
RegisteredPayees: k.GetAllPayeeAddresses(ctx),
}
}
50 changes: 28 additions & 22 deletions modules/apps/29-fee/keeper/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,16 @@ import (
)

func (suite *KeeperTestSuite) TestInitGenesis() {
// build PacketId & Fee
refundAcc := suite.chainA.SenderAccount.GetAddress()
packetID := channeltypes.NewPacketId(ibctesting.MockFeePort, ibctesting.FirstChannelID, 1)
fee := types.Fee{
RecvFee: defaultRecvFee,
AckFee: defaultAckFee,
TimeoutFee: defaultTimeoutFee,
}

// relayer addresses
sender := suite.chainA.SenderAccount.GetAddress().String()
counterparty := suite.chainB.SenderAccount.GetAddress().String()

genesisState := types.GenesisState{
IdentifiedFees: []types.IdentifiedPacketFees{
{
PacketId: packetID,
PacketFees: []types.PacketFee{
{
Fee: fee,
RefundAddress: refundAcc.String(),
Fee: types.NewFee(defaultRecvFee, defaultAckFee, defaultTimeoutFee),
RefundAddress: suite.chainA.SenderAccount.GetAddress().String(),
Relayers: nil,
},
},
Expand All @@ -41,11 +30,18 @@ func (suite *KeeperTestSuite) TestInitGenesis() {
},
RegisteredRelayers: []types.RegisteredRelayerAddress{
{
Address: sender,
CounterpartyAddress: counterparty,
Address: suite.chainA.SenderAccount.GetAddress().String(),
CounterpartyAddress: suite.chainB.SenderAccount.GetAddress().String(),
ChannelId: ibctesting.FirstChannelID,
},
},
RegisteredPayees: []types.RegisteredPayee{
{
RelayerAddress: suite.chainA.SenderAccount.GetAddress().String(),
Payee: suite.chainB.SenderAccount.GetAddress().String(),
ChannelId: ibctesting.FirstChannelID,
},
},
}

suite.chainA.GetSimApp().IBCFeeKeeper.InitGenesis(suite.chainA.GetContext(), genesisState)
Expand All @@ -60,9 +56,14 @@ func (suite *KeeperTestSuite) TestInitGenesis() {
suite.Require().True(isEnabled)

// check relayers
addr, found := suite.chainA.GetSimApp().IBCFeeKeeper.GetCounterpartyAddress(suite.chainA.GetContext(), sender, ibctesting.FirstChannelID)
addr, found := suite.chainA.GetSimApp().IBCFeeKeeper.GetCounterpartyAddress(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress().String(), ibctesting.FirstChannelID)
suite.Require().True(found)
suite.Require().Equal(genesisState.RegisteredRelayers[0].CounterpartyAddress, addr)

// check payee addresses
payeeAddr, found := suite.chainA.GetSimApp().IBCFeeKeeper.GetPayeeAddress(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress().String(), ibctesting.FirstChannelID)
suite.Require().True(found)
suite.Require().Equal(genesisState.RegisteredPayees[0].Payee, payeeAddr)
}

func (suite *KeeperTestSuite) TestExportGenesis() {
Expand All @@ -72,11 +73,7 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
// setup & escrow the packet fee
refundAcc := suite.chainA.SenderAccount.GetAddress()
packetID := channeltypes.NewPacketId(ibctesting.MockFeePort, ibctesting.FirstChannelID, 1)
fee := types.Fee{
RecvFee: defaultRecvFee,
AckFee: defaultAckFee,
TimeoutFee: defaultTimeoutFee,
}
fee := types.NewFee(defaultRecvFee, defaultAckFee, defaultTimeoutFee)

packetFee := types.NewPacketFee(fee, refundAcc.String(), []string{})
suite.chainA.GetSimApp().IBCFeeKeeper.SetFeesInEscrow(suite.chainA.GetContext(), packetID, types.NewPacketFees([]types.PacketFee{packetFee}))
Expand All @@ -90,6 +87,9 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
// set forward relayer address
suite.chainA.GetSimApp().IBCFeeKeeper.SetRelayerAddressForAsyncAck(suite.chainA.GetContext(), packetID, sender)

// set payee address
suite.chainA.GetSimApp().IBCFeeKeeper.SetPayeeAddress(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(), ibctesting.FirstChannelID)

// export genesis
genesisState := suite.chainA.GetSimApp().IBCFeeKeeper.ExportGenesis(suite.chainA.GetContext())

Expand All @@ -106,8 +106,14 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
// check registered relayer addresses
suite.Require().Equal(sender, genesisState.RegisteredRelayers[0].Address)
suite.Require().Equal(counterparty, genesisState.RegisteredRelayers[0].CounterpartyAddress)
suite.Require().Equal(ibctesting.FirstChannelID, genesisState.RegisteredRelayers[0].ChannelId)

// check registered relayer addresses
// check forward relayer addresses
suite.Require().Equal(sender, genesisState.ForwardRelayers[0].Address)
suite.Require().Equal(packetID, genesisState.ForwardRelayers[0].PacketId)

// check payee addresses
suite.Require().Equal(suite.chainA.SenderAccount.GetAddress().String(), genesisState.RegisteredPayees[0].RelayerAddress)
suite.Require().Equal(suite.chainB.SenderAccount.GetAddress().String(), genesisState.RegisteredPayees[0].Payee)
suite.Require().Equal(ibctesting.FirstChannelID, genesisState.RegisteredPayees[0].ChannelId)
}
25 changes: 25 additions & 0 deletions modules/apps/29-fee/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,31 @@ func (k Keeper) SetPayeeAddress(ctx sdk.Context, relayerAddr, payeeAddr, channel
store.Set(types.KeyPayeeAddress(relayerAddr, channelID), []byte(payeeAddr))
}

// GetAllPayeeAddresses returns all registered payees
func (k Keeper) GetAllPayeeAddresses(ctx sdk.Context) []types.RegisteredPayee {
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, []byte(types.PayeeAddressKeyPrefix))
defer iterator.Close()

var registeredPayees []types.RegisteredPayee
for ; iterator.Valid(); iterator.Next() {
addr, channelID, err := types.ParseKeyPayeeAddress(string(iterator.Key()))
if err != nil {
panic(err)
}

payee := types.RegisteredPayee{
RelayerAddress: addr,
Payee: string(iterator.Value()),
ChannelId: channelID,
}

registeredPayees = append(registeredPayees, payee)
}

return registeredPayees
}

// SetCounterpartyAddress maps the destination chain relayer address to the source relayer address
// The receiving chain must store the mapping from: address -> counterpartyAddress for the given channel
func (k Keeper) SetCounterpartyAddress(ctx sdk.Context, address, counterpartyAddress, channelID string) {
Expand Down
25 changes: 25 additions & 0 deletions modules/apps/29-fee/keeper/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,3 +276,28 @@ func (suite *KeeperTestSuite) TestGetAllRelayerAddresses() {
suite.Require().Len(addr, len(expectedAddr))
suite.Require().Equal(addr, expectedAddr)
}

func (suite *KeeperTestSuite) TestGetAllPayeeAddresses() {
var expectedPayees []types.RegisteredPayee

for i := 0; i < 3; i++ {
suite.chainA.GetSimApp().IBCFeeKeeper.SetPayeeAddress(
suite.chainA.GetContext(),
suite.chainA.SenderAccounts[i].SenderAccount.GetAddress().String(),
suite.chainB.SenderAccounts[i].SenderAccount.GetAddress().String(),
ibctesting.FirstChannelID,
)

registeredPayee := types.RegisteredPayee{
RelayerAddress: suite.chainA.SenderAccounts[i].SenderAccount.GetAddress().String(),
Payee: suite.chainB.SenderAccounts[i].SenderAccount.GetAddress().String(),
ChannelId: ibctesting.FirstChannelID,
}

expectedPayees = append(expectedPayees, registeredPayee)
}

registeredPayees := suite.chainA.GetSimApp().IBCFeeKeeper.GetAllPayeeAddresses(suite.chainA.GetContext())
suite.Require().Len(registeredPayees, len(expectedPayees))
suite.Require().ElementsMatch(expectedPayees, registeredPayees)
}
29 changes: 28 additions & 1 deletion modules/apps/29-fee/types/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,19 @@ import (
)

// NewGenesisState creates a 29-fee GenesisState instance.
func NewGenesisState(identifiedFees []IdentifiedPacketFees, feeEnabledChannels []FeeEnabledChannel, registeredRelayers []RegisteredRelayerAddress, forwardRelayers []ForwardRelayerAddress) *GenesisState {
func NewGenesisState(
identifiedFees []IdentifiedPacketFees,
feeEnabledChannels []FeeEnabledChannel,
registeredRelayers []RegisteredRelayerAddress,
forwardRelayers []ForwardRelayerAddress,
registeredPayees []RegisteredPayee,
) *GenesisState {
return &GenesisState{
IdentifiedFees: identifiedFees,
FeeEnabledChannels: feeEnabledChannels,
RegisteredRelayers: registeredRelayers,
ForwardRelayers: forwardRelayers,
RegisteredPayees: registeredPayees,
}
}

Expand All @@ -26,6 +33,7 @@ func DefaultGenesisState() *GenesisState {
ForwardRelayers: []ForwardRelayerAddress{},
FeeEnabledChannels: []FeeEnabledChannel{},
RegisteredRelayers: []RegisteredRelayerAddress{},
RegisteredPayees: []RegisteredPayee{},
}
}

Expand Down Expand Up @@ -55,6 +63,25 @@ func (gs GenesisState) Validate() error {
}
}

// Validate RegisteredPayees
for _, registeredPayee := range gs.RegisteredPayees {
if registeredPayee.RelayerAddress == registeredPayee.Payee {
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "relayer address and payee address must not be equal")
}

if _, err := sdk.AccAddressFromBech32(registeredPayee.RelayerAddress); err != nil {
return sdkerrors.Wrap(err, "failed to convert relayer address into sdk.AccAddress")
}

if _, err := sdk.AccAddressFromBech32(registeredPayee.Payee); err != nil {
return sdkerrors.Wrap(err, "failed to convert payee address into sdk.AccAddress")
}

if err := host.ChannelIdentifierValidator(registeredPayee.ChannelId); err != nil {
return sdkerrors.Wrapf(err, "invalid channel identifier: %s", registeredPayee.ChannelId)
}
}

// Validate RegisteredRelayers
for _, rel := range gs.RegisteredRelayers {
if _, err := sdk.AccAddressFromBech32(rel.Address); err != nil {
Expand Down
Loading