Skip to content

Commit 15fa37b

Browse files
authored
chore: update ics29 genesis state to support multiple packet fees (#957)
* adding new proto types and codegen * refactoring ics29 fees for more efficient storage * updating tests * updating genesis protos to use IdentifiedPacketFees * updating init/export genesis state functionality and tests
1 parent b02d193 commit 15fa37b

File tree

12 files changed

+136
-90
lines changed

12 files changed

+136
-90
lines changed

docs/ibc/proto-docs.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ GenesisState defines the fee middleware genesis state
846846

847847
| Field | Type | Label | Description |
848848
| ----- | ---- | ----- | ----------- |
849-
| `identified_fees` | [IdentifiedPacketFee](#ibc.applications.fee.v1.IdentifiedPacketFee) | repeated | |
849+
| `identified_fees` | [IdentifiedPacketFees](#ibc.applications.fee.v1.IdentifiedPacketFees) | repeated | |
850850
| `fee_enabled_channels` | [FeeEnabledChannel](#ibc.applications.fee.v1.FeeEnabledChannel) | repeated | |
851851
| `registered_relayers` | [RegisteredRelayerAddress](#ibc.applications.fee.v1.RegisteredRelayerAddress) | repeated | |
852852
| `forward_relayers` | [ForwardRelayerAddress](#ibc.applications.fee.v1.ForwardRelayerAddress) | repeated | |

modules/apps/29-fee/keeper/genesis.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88

99
// InitGenesis initializes the fee middleware application state from a provided genesis state
1010
func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) {
11-
for _, fee := range state.IdentifiedFees {
12-
k.SetFeeInEscrow(ctx, fee)
11+
for _, identifiedFees := range state.IdentifiedFees {
12+
k.SetFeesInEscrow(ctx, identifiedFees.PacketId, types.NewPacketFees(identifiedFees.PacketFees))
1313
}
1414

1515
for _, relayer := range state.RegisteredRelayers {

modules/apps/29-fee/keeper/genesis_test.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ import (
99
func (suite *KeeperTestSuite) TestInitGenesis() {
1010
// build PacketId & Fee
1111
refundAcc := suite.chainA.SenderAccount.GetAddress()
12-
packetId := channeltypes.NewPacketId(
13-
ibctesting.FirstChannelID,
14-
ibctesting.MockFeePort,
15-
uint64(1),
16-
)
12+
packetID := channeltypes.NewPacketId(ibctesting.FirstChannelID, ibctesting.MockFeePort, 1)
1713
fee := types.Fee{
1814
RecvFee: defaultReceiveFee,
1915
AckFee: defaultAckFee,
@@ -25,12 +21,16 @@ func (suite *KeeperTestSuite) TestInitGenesis() {
2521
counterparty := suite.chainB.SenderAccount.GetAddress().String()
2622

2723
genesisState := types.GenesisState{
28-
IdentifiedFees: []types.IdentifiedPacketFee{
24+
IdentifiedFees: []types.IdentifiedPacketFees{
2925
{
30-
PacketId: packetId,
31-
Fee: fee,
32-
RefundAddress: refundAcc.String(),
33-
Relayers: nil,
26+
PacketId: packetID,
27+
PacketFees: []types.PacketFee{
28+
{
29+
Fee: fee,
30+
RefundAddress: refundAcc.String(),
31+
Relayers: nil,
32+
},
33+
},
3434
},
3535
},
3636
FeeEnabledChannels: []types.FeeEnabledChannel{
@@ -51,9 +51,9 @@ func (suite *KeeperTestSuite) TestInitGenesis() {
5151
suite.chainA.GetSimApp().IBCFeeKeeper.InitGenesis(suite.chainA.GetContext(), genesisState)
5252

5353
// check fee
54-
identifiedFee, found := suite.chainA.GetSimApp().IBCFeeKeeper.GetFeeInEscrow(suite.chainA.GetContext(), packetId)
54+
feesInEscrow, found := suite.chainA.GetSimApp().IBCFeeKeeper.GetFeesInEscrow(suite.chainA.GetContext(), packetID)
5555
suite.Require().True(found)
56-
suite.Require().Equal(genesisState.IdentifiedFees[0], identifiedFee)
56+
suite.Require().Equal(genesisState.IdentifiedFees[0].PacketFees, feesInEscrow.PacketFees)
5757

5858
// check fee is enabled
5959
isEnabled := suite.chainA.GetSimApp().IBCFeeKeeper.IsFeeEnabled(suite.chainA.GetContext(), ibctesting.MockFeePort, ibctesting.FirstChannelID)
@@ -78,8 +78,8 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
7878
TimeoutFee: defaultTimeoutFee,
7979
}
8080

81-
identifiedPacketFee := types.NewIdentifiedPacketFee(packetID, fee, refundAcc.String(), []string{})
82-
suite.chainA.GetSimApp().IBCFeeKeeper.SetFeeInEscrow(suite.chainA.GetContext(), identifiedPacketFee)
81+
packetFee := types.NewPacketFee(fee, refundAcc.String(), []string{})
82+
suite.chainA.GetSimApp().IBCFeeKeeper.SetFeesInEscrow(suite.chainA.GetContext(), packetID, types.NewPacketFees([]types.PacketFee{packetFee}))
8383

8484
// relayer addresses
8585
sender := suite.chainA.SenderAccount.GetAddress().String()
@@ -99,9 +99,9 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
9999

100100
// check fee
101101
suite.Require().Equal(packetID, genesisState.IdentifiedFees[0].PacketId)
102-
suite.Require().Equal(fee, genesisState.IdentifiedFees[0].Fee)
103-
suite.Require().Equal(refundAcc.String(), genesisState.IdentifiedFees[0].RefundAddress)
104-
suite.Require().Equal([]string(nil), genesisState.IdentifiedFees[0].Relayers)
102+
suite.Require().Equal(fee, genesisState.IdentifiedFees[0].PacketFees[0].Fee)
103+
suite.Require().Equal(refundAcc.String(), genesisState.IdentifiedFees[0].PacketFees[0].RefundAddress)
104+
suite.Require().Equal([]string(nil), genesisState.IdentifiedFees[0].PacketFees[0].Relayers)
105105

106106
// check registered relayer addresses
107107
suite.Require().Equal(sender, genesisState.RegisteredRelayers[0].Address)

modules/apps/29-fee/keeper/keeper.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -328,15 +328,29 @@ func (k Keeper) HasFeeInEscrow(ctx sdk.Context, packetId channeltypes.PacketId)
328328
}
329329

330330
// GetAllIdentifiedPacketFees returns a list of all IdentifiedPacketFees that are stored in state
331-
func (k Keeper) GetAllIdentifiedPacketFees(ctx sdk.Context) []types.IdentifiedPacketFee {
331+
func (k Keeper) GetAllIdentifiedPacketFees(ctx sdk.Context) []types.IdentifiedPacketFees {
332332
store := ctx.KVStore(k.storeKey)
333-
iterator := sdk.KVStorePrefixIterator(store, []byte(types.FeeInEscrowPrefix))
333+
iterator := sdk.KVStorePrefixIterator(store, []byte(types.FeesInEscrowPrefix))
334334
defer iterator.Close()
335335

336-
var identifiedFees []types.IdentifiedPacketFee
336+
var identifiedFees []types.IdentifiedPacketFees
337337
for ; iterator.Valid(); iterator.Next() {
338-
fee := k.MustUnmarshalFee(iterator.Value())
339-
identifiedFees = append(identifiedFees, fee)
338+
keySplit := strings.Split(string(iterator.Key()), "/")
339+
340+
feesInEscrow := k.MustUnmarshalFees(iterator.Value())
341+
342+
channelID, portID := keySplit[2], keySplit[1]
343+
seq, err := strconv.ParseUint(keySplit[3], 10, 64)
344+
if err != nil {
345+
panic(err)
346+
}
347+
348+
identifiedFee := types.IdentifiedPacketFees{
349+
PacketId: channeltypes.NewPacketId(channelID, portID, seq),
350+
PacketFees: feesInEscrow.PacketFees,
351+
}
352+
353+
identifiedFees = append(identifiedFees, identifiedFee)
340354
}
341355

342356
return identifiedFees

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,21 +109,25 @@ func (suite *KeeperTestSuite) TestGetAllIdentifiedPacketFees() {
109109
}
110110

111111
// escrow the packet fee
112-
identifiedPacketFee := types.NewIdentifiedPacketFee(packetID, fee, refundAcc.String(), []string{})
113-
suite.chainA.GetSimApp().IBCFeeKeeper.SetFeeInEscrow(suite.chainA.GetContext(), identifiedPacketFee)
112+
packetFee := types.NewPacketFee(fee, refundAcc.String(), []string{})
113+
suite.chainA.GetSimApp().IBCFeeKeeper.SetFeesInEscrow(suite.chainA.GetContext(), packetID, types.NewPacketFees([]types.PacketFee{packetFee}))
114114

115-
expectedFees := []types.IdentifiedPacketFee{
115+
expectedFees := []types.IdentifiedPacketFees{
116116
{
117-
PacketId: packetID,
118-
Fee: fee,
119-
RefundAddress: refundAcc.String(),
120-
Relayers: nil,
117+
PacketId: packetID,
118+
PacketFees: []types.PacketFee{
119+
{
120+
Fee: fee,
121+
RefundAddress: refundAcc.String(),
122+
Relayers: nil,
123+
},
124+
},
121125
},
122126
}
123127

124-
fees := suite.chainA.GetSimApp().IBCFeeKeeper.GetAllIdentifiedPacketFees(suite.chainA.GetContext())
125-
suite.Require().Len(fees, len(expectedFees))
126-
suite.Require().Equal(fees, expectedFees)
128+
identifiedFees := suite.chainA.GetSimApp().IBCFeeKeeper.GetAllIdentifiedPacketFees(suite.chainA.GetContext())
129+
suite.Require().Len(identifiedFees, len(expectedFees))
130+
suite.Require().Equal(identifiedFees, expectedFees)
127131
}
128132

129133
func (suite *KeeperTestSuite) TestGetAllFeeEnabledChannels() {

modules/apps/29-fee/types/fee.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,25 @@ func NewPacketFee(fee Fee, refundAddr string, relayers []string) PacketFee {
1616
}
1717
}
1818

19+
// Validate performs basic stateless validation of the associated PacketFee
20+
func (p PacketFee) Validate() error {
21+
_, err := sdk.AccAddressFromBech32(p.RefundAddress)
22+
if err != nil {
23+
return sdkerrors.Wrap(err, "failed to convert RefundAddress into sdk.AccAddress")
24+
}
25+
26+
// enforce relayer is nil
27+
if p.Relayers != nil {
28+
return ErrRelayersNotNil
29+
}
30+
31+
if err := p.Fee.Validate(); err != nil {
32+
return err
33+
}
34+
35+
return nil
36+
}
37+
1938
// NewPacketFees creates and returns a new PacketFees struct including a list of type PacketFee
2039
func NewPacketFees(packetFees []PacketFee) PacketFees {
2140
return PacketFees{

modules/apps/29-fee/types/genesis.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
// NewGenesisState creates a 29-fee GenesisState instance.
13-
func NewGenesisState(identifiedFees []IdentifiedPacketFee, feeEnabledChannels []FeeEnabledChannel, registeredRelayers []RegisteredRelayerAddress, forwardRelayers []ForwardRelayerAddress) *GenesisState {
13+
func NewGenesisState(identifiedFees []IdentifiedPacketFees, feeEnabledChannels []FeeEnabledChannel, registeredRelayers []RegisteredRelayerAddress, forwardRelayers []ForwardRelayerAddress) *GenesisState {
1414
return &GenesisState{
1515
IdentifiedFees: identifiedFees,
1616
FeeEnabledChannels: feeEnabledChannels,
@@ -22,7 +22,7 @@ func NewGenesisState(identifiedFees []IdentifiedPacketFee, feeEnabledChannels []
2222
// DefaultGenesisState returns a GenesisState with "transfer" as the default PortID.
2323
func DefaultGenesisState() *GenesisState {
2424
return &GenesisState{
25-
IdentifiedFees: []IdentifiedPacketFee{},
25+
IdentifiedFees: []IdentifiedPacketFees{},
2626
ForwardRelayers: []ForwardRelayerAddress{},
2727
FeeEnabledChannels: []FeeEnabledChannel{},
2828
RegisteredRelayers: []RegisteredRelayerAddress{},
@@ -33,11 +33,16 @@ func DefaultGenesisState() *GenesisState {
3333
// failure.
3434
func (gs GenesisState) Validate() error {
3535
// Validate IdentifiedPacketFees
36-
for _, fee := range gs.IdentifiedFees {
37-
err := fee.Validate()
38-
if err != nil {
36+
for _, identifiedFees := range gs.IdentifiedFees {
37+
if err := identifiedFees.PacketId.Validate(); err != nil {
3938
return err
4039
}
40+
41+
for _, packetFee := range identifiedFees.PacketFees {
42+
if err := packetFee.Validate(); err != nil {
43+
return err
44+
}
45+
}
4146
}
4247

4348
// Validate FeeEnabledChannels

modules/apps/29-fee/types/genesis.pb.go

Lines changed: 41 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

modules/apps/29-fee/types/genesis_test.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,16 @@ func TestValidateGenesis(t *testing.T) {
168168
tc.malleate()
169169

170170
genState := types.GenesisState{
171-
IdentifiedFees: []types.IdentifiedPacketFee{
171+
IdentifiedFees: []types.IdentifiedPacketFees{
172172
{
173-
PacketId: packetId,
174-
Fee: fee,
175-
RefundAddress: refundAcc,
176-
Relayers: nil,
173+
PacketId: packetId,
174+
PacketFees: []types.PacketFee{
175+
{
176+
Fee: fee,
177+
RefundAddress: refundAcc,
178+
Relayers: nil,
179+
},
180+
},
177181
},
178182
},
179183
FeeEnabledChannels: []types.FeeEnabledChannel{

proto/ibc/applications/fee/v1/ack.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ import "gogoproto/gogo.proto";
1111
message IncentivizedAcknowledgement {
1212
bytes result = 1;
1313
string forward_relayer_address = 2 [(gogoproto.moretags) = "yaml:\"forward_relayer_address\""];
14-
bool underlying_app_success = 3 [(gogoproto.moretags) = "yaml:\"underlying_app_successl\""];
14+
bool underlying_app_success = 3 [(gogoproto.moretags) = "yaml:\"underlying_app_successl\""];
1515
}

0 commit comments

Comments
 (0)