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

ICS 29: Fee Middleware #276

Merged
merged 87 commits into from
Apr 6, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
18feadf
scaffolding for 29-fee (#274)
colin-axner Jul 21, 2021
4b9a832
feat: adding proto files for fee payment middleware (#272)
seantking Jul 26, 2021
158a251
fix: removing unncessary fields MsgEscrow & adding query params (#300)
seantking Jul 27, 2021
c63af4a
Merge branch 'main' into ics29-fee-middleware
colin-axner Aug 12, 2021
e3704c6
feat: #258 Register Counterparty Address (#376)
seantking Sep 8, 2021
70c58af
fix: remove comments for imports (#385)
seantking Sep 9, 2021
dd4f8c7
feat: Add handshake logic to ics29 (#307)
AdityaSripal Sep 27, 2021
67bd594
Fee Middleware: Escrow logic (#465)
seantking Nov 5, 2021
405f193
feat: update protos, grpc queries (#488)
charleenfei Nov 10, 2021
8ebbe18
store refund address in IdentifiedPacketFee (#546)
AdityaSripal Nov 18, 2021
d419972
29-Fee: Genesis (#557)
seantking Nov 24, 2021
4dbc83e
feat: adding genesis validation + tests (#561)
seantking Nov 24, 2021
c4dff6c
feat: add incentivised ack proto (#564)
charleenfei Nov 29, 2021
edd11c6
Fee Closing Handshake (#551)
AdityaSripal Nov 29, 2021
885fb9a
Fee Middleware: Add ICS4 wrapper (#562)
seantking Dec 1, 2021
a737132
feat: ics 29 packet callbacks (#357)
charleenfei Dec 21, 2021
53b2f67
Merge branch 'main' of github.com:cosmos/ibc-go into ics29-fee-middle…
colin-axner Jan 12, 2022
e0cc81a
update imports to v3
colin-axner Jan 12, 2022
120fd76
regenerate proto files
colin-axner Jan 12, 2022
0fbc6bb
fix build
colin-axner Jan 12, 2022
dbda885
update ics29 to tip of main (#716)
colin-axner Jan 12, 2022
9285133
fix: event caching for fee distribution (#661)
charleenfei Jan 12, 2022
f3e9f95
ics4 callbacks fee middleware (#580)
seantking Jan 12, 2022
26731ce
chore: making PacketId non nullable (#737)
seantking Jan 18, 2022
764df84
nits: proto spacing + naming (#739)
seantking Jan 20, 2022
d761982
sean/fix-proto-identified-fee-not-null (#746)
seantking Jan 20, 2022
f552fb2
nits: more ics29 nits (#741)
seantking Jan 20, 2022
16e452b
nit: update err syntax (#747)
seantking Jan 20, 2022
b16353e
feat: adding Route, Type, GetSignBytes for all messages (#743)
seantking Jan 21, 2022
b618f02
hygiene: add validate fn for Fee (#748)
seantking Jan 21, 2022
13f77de
fix: app.go (#789)
seantking Jan 26, 2022
6cb4a38
refactor: ics29 json encoded version metadata (#883)
damiannolan Feb 9, 2022
e0161a7
Merge branch 'main' of github.com:cosmos/ibc-go into ics29-fee-middle…
colin-axner Feb 10, 2022
dedbb57
chore: bump ics29 to tip of main (#900)
colin-axner Feb 10, 2022
6f19978
fix: return nil on OnRecvPacket for async pay (#911)
seantking Feb 15, 2022
ea2984b
nit: ics29 comments (#910)
seantking Feb 15, 2022
323c574
Merge branch 'main' into ics29-fee-middleware
colin-axner Feb 15, 2022
fb243c6
chore: Add transfer test for ics29 (#901)
colin-axner Feb 16, 2022
8d226de
refactor: ics29 OnChanOpenInit callback tests now use mock module (#924)
colin-axner Feb 16, 2022
2c1ff0b
feat: allow multiple addrs to incentivize packets (#915)
damiannolan Feb 16, 2022
39ef8d7
chore: remove spec directory from ics29 (#934)
colin-axner Feb 17, 2022
1fb4b5a
refactor: use mock module for ics29 closing handshakes (#926)
colin-axner Feb 17, 2022
9895948
refactor: use mock module for ics29 grpc_query_test.go (#933)
colin-axner Feb 17, 2022
acc699d
refactor: readjust keeper_test.go to use mock module (#930)
colin-axner Feb 17, 2022
9b2d96d
fix: fields for genesis should be non nullable (#938)
seantking Feb 17, 2022
06f2730
refactor: use mock module for ics29 escrow_test.go (#932)
colin-axner Feb 17, 2022
ff15335
refactor: use mock module for ics29 genesis_test.go (#931)
colin-axner Feb 17, 2022
d8b9821
ics29:feat: emit event escrow (#914)
seantking Feb 17, 2022
adc66d2
refactor: OnRecvPacket to use mock module (#927)
colin-axner Feb 18, 2022
4326c14
refactor: ics29 OnChanOpenTry/Ack use mock module for testing instead…
colin-axner Feb 18, 2022
ad7827f
refactor: use mock module for OnAcknowledgePacket callback testing (#…
colin-axner Feb 21, 2022
7c6076f
refactor: OnTimeoutPacket to use mock module (#928)
colin-axner Feb 21, 2022
179c4f4
chore: add packet id arg to EscrowPacketFee (#951)
damiannolan Feb 21, 2022
c14d2b4
chore: remove legacy testing functions (#954)
colin-axner Feb 21, 2022
99db143
fix:ics29: WriteAck update + adding success bool to IncentivizedAck (…
seantking Feb 21, 2022
74afccd
chore: add cli cmd to incentivize existing packet (async) (#965)
colin-axner Feb 22, 2022
6928af7
ics29:fix: counterparty addr must contain channelID (#937)
seantking Feb 22, 2022
6999e10
chore: fix err msg (#971)
colin-axner Feb 22, 2022
4fb6d18
ics29:fix: store source address for query later on WriteAck (#912)
seantking Feb 23, 2022
b02d193
refactor: make fee storage more efficient (#956)
damiannolan Feb 23, 2022
15fa37b
chore: update ics29 genesis state to support multiple packet fees (#957)
damiannolan Feb 23, 2022
9350d53
chore: update MsgPayPacketFeeAsync fields (#979)
damiannolan Feb 24, 2022
f1ba06f
chore: add ParseKeyFeesInEscrow helper function (#998)
colin-axner Feb 24, 2022
fcea26d
chore: update grpc queries to handle multiple fees (#967)
damiannolan Feb 24, 2022
9c508d2
feat: CLI cmd for MsgRegisterCounterpartyAddress (#987)
seantking Feb 24, 2022
7991f79
fix: ics29: switch source with destintion for chan/port IDs (#961)
seantking Feb 25, 2022
9ece5da
test: cleanup 29-fee/types tests (#1006)
damiannolan Feb 25, 2022
f8b4345
feat: grpc query total recv packet fees (#1015)
damiannolan Mar 1, 2022
e51e2c9
chore: switch code ordering (#1025)
colin-axner Mar 1, 2022
5f8fc9f
feat: Add ParseKeyFeeEnabled and rename FeeEnabledKey -> KeyFeeEnable…
colin-axner Mar 1, 2022
4623772
feat: ics29 cli for query total recv fees (#1035)
damiannolan Mar 1, 2022
8d380ba
feat: grpc query total ack fees (#1032)
damiannolan Mar 1, 2022
9137084
feat: grpc query total timeout fees (#1033)
damiannolan Mar 2, 2022
d788adf
feat: adding clis for total ack and timeout queries (#1043)
damiannolan Mar 2, 2022
478db4f
add ParseKeyForwardRelayerAddress function + test (#1046)
charleenfei Mar 2, 2022
71167c4
chore: remove unused ics29 keeper funcs (#1044)
damiannolan Mar 3, 2022
4bf859a
chore: add gRPC for querying incentivized packets for a specific chan…
colin-axner Mar 3, 2022
b33b0a7
add function EscrowAccountHasBalance (#1042)
colin-axner Mar 3, 2022
f3ee8de
feat: ParseKeyCounterpartyRelayer function (#1047)
charleenfei Mar 3, 2022
db88c84
chore: adding queries to cmd builder (#1057)
damiannolan Mar 3, 2022
637652d
chore: update ics29 protodocs (#1055)
damiannolan Mar 4, 2022
4a0e00c
Merge branch 'main' into ics29-fee-middleware
crodriguezvega Mar 22, 2022
ab90f07
add counter party channel ID to argument list of on channel open ack …
crodriguezvega Mar 22, 2022
3ab2251
ADR 004: Fee module locking in the presence of severe bugs (#1060)
colin-axner Mar 29, 2022
e1cca36
nit: packetID var name (#1214)
seantking Apr 5, 2022
e65e881
Merge branch 'main' into ics29-fee-middleware
crodriguezvega Apr 6, 2022
39d4c56
ics29: update with changes from main (#1221)
seantking Apr 6, 2022
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
Prev Previous commit
Next Next commit
ics29:fix: store source address for query later on WriteAck (#912)
* fix: for async WriteAck store source address for query later

* ics29:fix: update genesis type (#913)

* fix: adding ForwardRelayerAddresses to genesis

* fix: trimspace on string check

* nit: err + trimspace error case

* refactor: updating WriteAck + keeper fn name

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

Co-authored-by: Damian Nolan <damiannolan@gmail.com>

* chore: remove legacy testing functions (#954)

* fix:ics29: WriteAck update + adding success bool to IncentivizedAck (#952)

* fix: updating WriteAck & adding Success boolean to IncentivizedAcknowledgement

* feat: adding check of is fee enabled

* nit: change successful to underlying_application_success

* test: adding seperate test for fee disabled write async

* Update modules/apps/29-fee/ibc_module_test.go

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

* test: adding check to compare hash of acks

* fix: var name

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

Co-authored-by: Damian Nolan <damiannolan@gmail.com>
Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com>
Co-authored-by: Aditya <adityasripal@gmail.com>
  • Loading branch information
4 people authored Feb 23, 2022
commit 4fb6d18e515ba1140431ccfa17cab0f7574b51a5
11 changes: 6 additions & 5 deletions modules/apps/29-fee/ibc_module.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,14 +196,15 @@ func (im IBCModule) OnRecvPacket(

ack := im.app.OnRecvPacket(ctx, packet, relayer)

forwardRelayer, found := im.keeper.GetCounterpartyAddress(ctx, relayer.String(), packet.DestinationChannel)

// incase of async aknowledgement (ack == nil) store the ForwardRelayer address for use later
if ack == nil && found {
im.keeper.SetForwardRelayerAddress(ctx, channeltypes.NewPacketId(packet.GetSourceChannel(), packet.GetSourcePort(), packet.GetSequence()), forwardRelayer)
// incase of async aknowledgement (ack == nil) store the relayer address for use later during async WriteAcknowledgement
if ack == nil {
im.keeper.SetRelayerAddressForAsyncAck(ctx, channeltypes.NewPacketId(packet.GetSourceChannel(), packet.GetSourcePort(), packet.GetSequence()), relayer.String())
return nil
}

// if forwardRelayer is not found we refund recv_fee
forwardRelayer, _ := im.keeper.GetCounterpartyAddress(ctx, relayer.String(), packet.GetSourceChannel())

return types.NewIncentivizedAcknowledgement(forwardRelayer, ack.Acknowledgement(), ack.Success())
}

Expand Down
2 changes: 1 addition & 1 deletion modules/apps/29-fee/keeper/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) {
}

for _, forwardAddr := range state.ForwardRelayers {
k.SetForwardRelayerAddress(ctx, forwardAddr.PacketId, forwardAddr.Address)
k.SetRelayerAddressForAsyncAck(ctx, forwardAddr.PacketId, forwardAddr.Address)
}

for _, enabledChan := range state.FeeEnabledChannels {
Expand Down
2 changes: 1 addition & 1 deletion modules/apps/29-fee/keeper/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func (suite *KeeperTestSuite) TestExportGenesis() {
suite.chainA.GetSimApp().IBCFeeKeeper.SetCounterpartyAddress(suite.chainA.GetContext(), sender, counterparty, ibctesting.FirstChannelID)

// set forward relayer address
suite.chainA.GetSimApp().IBCFeeKeeper.SetForwardRelayerAddress(suite.chainA.GetContext(), packetID, sender)
suite.chainA.GetSimApp().IBCFeeKeeper.SetRelayerAddressForAsyncAck(suite.chainA.GetContext(), packetID, sender)

// export genesis
genesisState := suite.chainA.GetSimApp().IBCFeeKeeper.ExportGenesis(suite.chainA.GetContext())
Expand Down
8 changes: 4 additions & 4 deletions modules/apps/29-fee/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,14 +175,14 @@ func (k Keeper) GetAllRelayerAddresses(ctx sdk.Context) []types.RegisteredRelaye
return registeredAddrArr
}

// SetForwardRelayerAddress sets the forward relayer address during OnRecvPacket in case of async acknowledgement
func (k Keeper) SetForwardRelayerAddress(ctx sdk.Context, packetId channeltypes.PacketId, address string) {
// SetRelayerAddressForAsyncAck sets the forward relayer address during OnRecvPacket in case of async acknowledgement
func (k Keeper) SetRelayerAddressForAsyncAck(ctx sdk.Context, packetId channeltypes.PacketId, address string) {
store := ctx.KVStore(k.storeKey)
store.Set(types.KeyForwardRelayerAddress(packetId), []byte(address))
}

// GetForwardRelayerAddress gets forward relayer address for a particular packet
func (k Keeper) GetForwardRelayerAddress(ctx sdk.Context, packetId channeltypes.PacketId) (string, bool) {
// GetRelayerAddressForAsyncAck gets forward relayer address for a particular packet
func (k Keeper) GetRelayerAddressForAsyncAck(ctx sdk.Context, packetId channeltypes.PacketId) (string, bool) {
store := ctx.KVStore(k.storeKey)
key := types.KeyForwardRelayerAddress(packetId)
if !store.Has(key) {
Expand Down
15 changes: 12 additions & 3 deletions modules/apps/29-fee/keeper/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package keeper

import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"

"github.com/cosmos/ibc-go/v3/modules/apps/29-fee/types"
Expand All @@ -24,11 +25,19 @@ func (k Keeper) WriteAcknowledgement(ctx sdk.Context, chanCap *capabilitytypes.C

// retrieve the forward relayer that was stored in `onRecvPacket`
packetId := channeltypes.NewPacketId(packet.GetSourceChannel(), packet.GetSourcePort(), packet.GetSequence())
relayer, _ := k.GetForwardRelayerAddress(ctx, packetId)

k.DeleteForwardRelayerAddress(ctx, packetId)
relayer, found := k.GetRelayerAddressForAsyncAck(ctx, packetId)
if !found {
return sdkerrors.Wrapf(types.ErrRelayerNotFoundForAsyncAck, "no relayer address stored for async acknowledgement for packet with portID: %s, channelID: %s, sequence: %d", packetId.PortId, packetId.ChannelId, packetId.Sequence)
}

// it is possible that a relayer has not registered a counterparty address.
// if there is no registered counterparty address then write acknowledgement with empty relayer address and refund recv_fee.
forwardRelayer, _ := k.GetCounterpartyAddress(ctx, relayer, packet.GetSourceChannel())

ack := types.NewIncentivizedAcknowledgement(relayer, acknowledgement.Acknowledgement(), acknowledgement.Success())
ack := types.NewIncentivizedAcknowledgement(forwardRelayer, acknowledgement.Acknowledgement(), acknowledgement.Success())

k.DeleteForwardRelayerAddress(ctx, packetId)

// ics4Wrapper may be core IBC or higher-level middleware
return k.ics4Wrapper.WriteAcknowledgement(ctx, chanCap, packet, ack)
Expand Down
15 changes: 8 additions & 7 deletions modules/apps/29-fee/keeper/relay_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,17 @@ func (suite *KeeperTestSuite) TestWriteAcknowledgementAsync() {
}{
{
"success",
func() {},
true,
},
{
"forward relayer address is successfully deleted",
func() {
suite.chainB.GetSimApp().IBCFeeKeeper.SetForwardRelayerAddress(suite.chainB.GetContext(), channeltypes.NewPacketId(suite.path.EndpointA.ChannelID, suite.path.EndpointA.ChannelConfig.PortID, 1), suite.chainA.SenderAccount.GetAddress().String())
suite.chainB.GetSimApp().IBCFeeKeeper.SetRelayerAddressForAsyncAck(suite.chainB.GetContext(), channeltypes.NewPacketId(suite.path.EndpointA.ChannelID, suite.path.EndpointA.ChannelConfig.PortID, 1), suite.chainA.SenderAccount.GetAddress().String())
suite.chainB.GetSimApp().IBCFeeKeeper.SetCounterpartyAddress(suite.chainB.GetContext(), suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(), suite.path.EndpointA.ChannelID)
},
true,
},
{
"relayer address not set for async WriteAcknowledgement",
func() {},
false,
},
}

for _, tc := range testCases {
Expand Down Expand Up @@ -56,7 +57,7 @@ func (suite *KeeperTestSuite) TestWriteAcknowledgementAsync() {

if tc.expPass {
suite.Require().NoError(err)
_, found := suite.chainB.GetSimApp().IBCFeeKeeper.GetForwardRelayerAddress(suite.chainB.GetContext(), channeltypes.NewPacketId(suite.path.EndpointA.ChannelID, suite.path.EndpointA.ChannelConfig.PortID, 1))
_, found := suite.chainB.GetSimApp().IBCFeeKeeper.GetRelayerAddressForAsyncAck(suite.chainB.GetContext(), channeltypes.NewPacketId(suite.path.EndpointA.ChannelID, suite.path.EndpointA.ChannelConfig.PortID, 1))
suite.Require().False(found)
} else {
suite.Require().Error(err)
Expand Down
1 change: 1 addition & 0 deletions modules/apps/29-fee/types/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ var (
ErrCounterpartyAddressEmpty = sdkerrors.Register(ModuleName, 7, "counterparty address must not be empty")
ErrForwardRelayerAddressNotFound = sdkerrors.Register(ModuleName, 8, "forward relayer address not found")
ErrFeeNotEnabled = sdkerrors.Register(ModuleName, 9, "fee module is not enabled for this channel. If this error occurs after channel setup, fee module may not be enabled")
ErrRelayerNotFoundForAsyncAck = sdkerrors.Register(ModuleName, 10, "relayer address must be stored for async WriteAcknowledgement")
)
22 changes: 18 additions & 4 deletions modules/apps/29-fee/types/genesis.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
package types

import (
"strings"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"

host "github.com/cosmos/ibc-go/v3/modules/core/24-host"
)

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

// DefaultGenesisState returns a GenesisState with "transfer" as the default PortID.
func DefaultGenesisState() *GenesisState {
return &GenesisState{
IdentifiedFees: []IdentifiedPacketFee{},
ForwardRelayers: []ForwardRelayerAddress{},
FeeEnabledChannels: []FeeEnabledChannel{},
RegisteredRelayers: []RegisteredRelayerAddress{},
}
Expand Down Expand Up @@ -48,15 +52,25 @@ func (gs GenesisState) Validate() error {

// Validate RegisteredRelayers
for _, rel := range gs.RegisteredRelayers {
_, err := sdk.AccAddressFromBech32(rel.Address)
if err != nil {
if _, err := sdk.AccAddressFromBech32(rel.Address); err != nil {
return sdkerrors.Wrap(err, "failed to convert source relayer address into sdk.AccAddress")
}

if rel.CounterpartyAddress == "" {
if strings.TrimSpace(rel.CounterpartyAddress) == "" {
return ErrCounterpartyAddressEmpty
}
}

// Validate ForwardRelayers
for _, rel := range gs.ForwardRelayers {
if _, err := sdk.AccAddressFromBech32(rel.Address); err != nil {
return sdkerrors.Wrap(err, "failed to convert forward relayer address into sdk.AccAddress")
}

if err := rel.PacketId.Validate(); err != nil {
return err
}
}

return nil
}
42 changes: 33 additions & 9 deletions modules/apps/29-fee/types/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@ var (

func TestValidateGenesis(t *testing.T) {
var (
packetId channeltypes.PacketId
fee types.Fee
refundAcc string
sender string
counterparty string
portID string
channelID string
seq uint64
packetId channeltypes.PacketId
fee types.Fee
refundAcc string
sender string
forwardAddr string
counterparty string
portID string
channelID string
packetChannelID string
seq uint64
)

testCases := []struct {
Expand Down Expand Up @@ -118,7 +120,21 @@ func TestValidateGenesis(t *testing.T) {
{
"invalid RegisteredRelayers: invalid counterparty",
func() {
counterparty = ""
counterparty = " "
},
false,
},
{
"invalid ForwardRelayerAddress: invalid forwardAddr",
func() {
forwardAddr = ""
},
false,
},
{
"invalid ForwardRelayerAddress: invalid packet",
func() {
packetChannelID = "1"
},
false,
},
Expand All @@ -127,6 +143,7 @@ func TestValidateGenesis(t *testing.T) {
for _, tc := range testCases {
portID = transfertypes.PortID
channelID = ibctesting.FirstChannelID
packetChannelID = ibctesting.FirstChannelID
seq = uint64(1)

// build PacketId & Fee
Expand All @@ -146,6 +163,7 @@ func TestValidateGenesis(t *testing.T) {
// relayer addresses
sender = addr1
counterparty = addr2
forwardAddr = addr2

tc.malleate()

Expand All @@ -170,6 +188,12 @@ func TestValidateGenesis(t *testing.T) {
CounterpartyAddress: counterparty,
},
},
ForwardRelayers: []types.ForwardRelayerAddress{
{
Address: forwardAddr,
PacketId: channeltypes.NewPacketId(packetChannelID, portID, 1),
},
},
}

err := genState.Validate()
Expand Down