Skip to content

Commit

Permalink
feat: adding RegisteredPayees to ics29 genesis state (#1492)
Browse files Browse the repository at this point in the history
* [WIP] adding RegisterDistributionAddress rpc endpoint and implementation. Store funcs, keys..

* updating tests

* adding registered distribution addresses to genesis state

* refactor and update validate genesis tests

* adding cli for register distribution address rpc

* renaming RegisterDistributionAddress rpc to RegisterPayee

* renaming RegisterDistributionAddress to RegisterPayee

* updating godocs and field ordering

* updating inline comment

* renaming to regsitered payees and propagating changes in genesis

* updating godoc in keeper.go

* Update modules/apps/29-fee/keeper/keeper_test.go

Co-authored-by: Aditya <adityasripal@gmail.com>

Co-authored-by: Aditya <adityasripal@gmail.com>
  • Loading branch information
damiannolan and AdityaSripal authored Jun 8, 2022
1 parent 040f2ea commit 57aa5ec
Show file tree
Hide file tree
Showing 9 changed files with 599 additions and 173 deletions.
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

0 comments on commit 57aa5ec

Please sign in to comment.