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

fee middleware: grpc queries #488

Merged
merged 55 commits into from
Nov 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
435efc7
fix: adding second endpoint for async pay fee + renaming types
seantking Oct 1, 2021
8f2c51a
feat: adding escrow logic
seantking Oct 1, 2021
a410af6
feat: updating proto types & escrow logic
seantking Oct 4, 2021
0e6823f
fix: stub fn & proto comment
seantking Oct 5, 2021
f41e520
feat: adding PayFee & PayFeeTimeout & escrow_test
seantking Oct 6, 2021
e4bd49a
test: adding happy path for EscrowPacketFee
seantking Oct 6, 2021
ca7f4e2
fix: comments, error handling
seantking Oct 7, 2021
6a5add7
fix: comments & grammar
seantking Oct 7, 2021
952a3e3
grpc scaffold
charleenfei Oct 8, 2021
535e2c6
test: adding unhappy path for escrow
seantking Oct 8, 2021
5bd0e32
tests(escrow): adding hasBalance check for module acc
seantking Oct 8, 2021
31fcee3
test(PayFee): adding happy path for PayFee tests
seantking Oct 8, 2021
487f78d
tests(PayFee, PayFeeTimeout): adding tests
seantking Oct 8, 2021
f25932f
fix: adding relayers back to IdentifiedPacket
seantking Oct 11, 2021
90284c7
wip
charleenfei Oct 11, 2021
ea37edc
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 11, 2021
38566bc
fix: removing refund acc from key
seantking Oct 11, 2021
ceb49ca
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 11, 2021
dd0044b
fix: storing IdentifiedPacketFee in state instead of Fee
seantking Oct 11, 2021
526a13d
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 11, 2021
5b4a395
feat: adding msg_server test for registerCPAddr, wiring for codec + s…
seantking Oct 11, 2021
3c2dd24
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 11, 2021
c9af582
test: adding msg_server test for PayPacketFee
seantking Oct 12, 2021
980d748
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 12, 2021
d325146
test: adding PayPacketFeeAsync msg_server test
seantking Oct 12, 2021
b6ef099
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 12, 2021
ea9b30b
chore: updating PayFee -> DistributeFee & minor nits
seantking Oct 13, 2021
ac7584f
nit: removing unnecessary nil check
seantking Oct 13, 2021
5bd3382
update protos
charleenfei Oct 13, 2021
be4b865
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 13, 2021
ec2f0d4
query function
charleenfei Oct 13, 2021
46fe890
prefix & query heights
charleenfei Oct 13, 2021
c44a81c
refactor: add portId to store key & use packetId as param
seantking Oct 13, 2021
a8c3cff
fix: add DeleteFeeInEscrow & remove fee on successful distribution
seantking Oct 13, 2021
4f490ea
tests: adding validation & signer tests for PayFee/Async & updating p…
seantking Oct 13, 2021
f1fde1d
chore: adding NewIdentifiedPacketFee fn
seantking Oct 13, 2021
eeb4376
fix: getter/setter for counterparty address + fix NewIdentifiedPacketFee
seantking Oct 14, 2021
4612bf2
fix: updating EscrowPacketFee with correct usage of coins api
seantking Oct 14, 2021
3494a0f
test: adding balance check for refund acc after escrow
seantking Oct 14, 2021
f4c37e6
fix: remove unncessary errors
seantking Oct 14, 2021
f547a2c
Merge branch 'sean/issue#-259-escrow-logic' of github.com:cosmos/ibc-…
charleenfei Oct 14, 2021
b666224
wip
charleenfei Oct 15, 2021
96999c4
fix tests
charleenfei Oct 27, 2021
0b733ab
test: updating escrow tests + miscellaneous fixes
seantking Nov 3, 2021
2be4ab5
nit: updating var names
seantking Nov 3, 2021
cb2cbc3
docs: godoc
seantking Nov 3, 2021
66454c6
refactor: IdentifiedPacketFee & Fee no longer pointers
seantking Nov 3, 2021
06d4c25
fixes: small fixes
seantking Nov 3, 2021
8757f9a
fix merge conflict
charleenfei Nov 3, 2021
f7acaa4
Merge branch 'ics29-fee-middleware' into issue#479-grpc-query
charleenfei Nov 8, 2021
23c98ab
initial fix
charleenfei Nov 8, 2021
0864c55
interim fix
charleenfei Nov 8, 2021
8779ed7
merge conflict changes
charleenfei Nov 8, 2021
22b62b5
updates for nits
charleenfei Nov 8, 2021
fc4db7a
update for nits
charleenfei Nov 10, 2021
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
102 changes: 31 additions & 71 deletions docs/ibc/proto-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,10 @@
- [GenesisState](#ibc.applications.fee.v1.GenesisState)

- [ibc/applications/fee/v1/query.proto](#ibc/applications/fee/v1/query.proto)
- [QueryAckFeeRequest](#ibc.applications.fee.v1.QueryAckFeeRequest)
- [QueryAckFeeResponse](#ibc.applications.fee.v1.QueryAckFeeResponse)
- [QueryIncentivizedPacketRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketRequest)
- [QueryIncentivizedPacketResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketResponse)
- [QueryIncentivizedPacketsRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsRequest)
- [QueryIncentivizedPacketsResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsResponse)
- [QueryReceiveFeeRequest](#ibc.applications.fee.v1.QueryReceiveFeeRequest)
- [QueryReceiveFeeResponse](#ibc.applications.fee.v1.QueryReceiveFeeResponse)
- [QueryTimeoutFeeRequest](#ibc.applications.fee.v1.QueryTimeoutFeeRequest)
- [QueryTimeoutFeeResponse](#ibc.applications.fee.v1.QueryTimeoutFeeResponse)

- [Query](#ibc.applications.fee.v1.Query)

Expand Down Expand Up @@ -698,38 +692,6 @@ GenesisState defines the fee middleware genesis state



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

### QueryAckFeeRequest
QueryAckFeeRequest is the request type for querying the acknowledgement fee


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | PacketID |
| `relayer_address` | [string](#string) | | Caller should provide the intended relayer address in case the fee is dependent on specific relayer(s). |
| `query_height` | [uint64](#uint64) | | Height to query at |






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

### QueryAckFeeResponse
QueryAckFeeResponse is the response type for the AckFee RPC


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | |






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

### QueryIncentivizedPacketRequest
Expand Down Expand Up @@ -791,75 +753,73 @@ QueryIncentivizedPacketsResponse is the response type for the incentivized packe



<!-- end messages -->

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

### QueryReceiveFeeRequest
QueryReceiveFeeRequest is the request type for querying the receive fee


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | PacketID |
| `relayer_address` | [string](#string) | | Caller should provide the intended relayer address in case the fee is dependent on specific relayer(s). |
| `query_height` | [uint64](#uint64) | | Height to query at |


<!-- end enums -->

<!-- end HasExtensions -->


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

<a name="ibc.applications.fee.v1.QueryReceiveFeeResponse"></a>
### Query
Query provides defines the gRPC querier service.

### QueryReceiveFeeResponse
QueryReceiveFeeResponse is the response type for the ReceiveFee RPC
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
| `IncentivizedPackets` | [QueryIncentivizedPacketsRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketsRequest) | [QueryIncentivizedPacketsResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketsResponse) | Gets all incentivized packets | GET|/ibc/apps/fee/v1/incentivized_packets|
| `IncentivizedPacket` | [QueryIncentivizedPacketRequest](#ibc.applications.fee.v1.QueryIncentivizedPacketRequest) | [QueryIncentivizedPacketResponse](#ibc.applications.fee.v1.QueryIncentivizedPacketResponse) | Gets the fees expected for submitting the ReceivePacket, AcknowledgementPacket, and TimeoutPacket messages for the given packet | GET|/ibc/apps/fee/v1/incentivized_packet/port/{packet_id.port_id}/channel/{packet_id.channel_id}/sequence/{packet_id.sequence}|

<!-- end services -->

| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | |


<a name="ibc/applications/fee/v1/tx.proto"></a>
<p align="right"><a href="#top">Top</a></p>

## ibc/applications/fee/v1/tx.proto



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

### QueryTimeoutFeeRequest
QueryTimeoutFeeRequest is the request type for querying the timeout fee
### MsgPayPacketFee
MsgPayPacketFee defines the request type EscrowPacketFee RPC
This Msg can be used to pay for a packet at the next sequence send & should be combined with the Msg that will be
paid for


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `packet_id` | [ibc.core.channel.v1.PacketId](#ibc.core.channel.v1.PacketId) | | PacketID |
| `relayer_address` | [string](#string) | | Caller should provide the intended relayer address in case the fee is dependent on specific relayer(s). |
| `query_height` | [uint64](#uint64) | | Height to query at |
| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | |
| `source_port_id` | [string](#string) | | source channel port identifier |
| `source_channel_id` | [string](#string) | | source channel unique identifier |
| `signer` | [string](#string) | | account address to refund fee if necessary |
| `relayers` | [string](#string) | repeated | |






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

### QueryTimeoutFeeResponse
QueryTimeoutFeeResponse is the response type for the timeout RPC
### MsgPayPacketFeeAsync
MsgPayPacketFeeAsync defines the request type PayPacketFeeAsync RPC
This Msg can be used to pay for a packet at a specified sequence (instead of the next sequence send)


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `fee` | [Fee](#ibc.applications.fee.v1.Fee) | | |
| `identified_packet_fee` | [IdentifiedPacketFee](#ibc.applications.fee.v1.IdentifiedPacketFee) | | packet to pay fee for |
| `signer` | [string](#string) | | account address to refund fee if necessary |





<!-- end messages -->

<!-- end enums -->

<!-- end HasExtensions -->
<a name="ibc.applications.fee.v1.MsgPayPacketFeeAsyncResponse"></a>


<a name="ibc.applications.fee.v1.Query"></a>
Expand Down
64 changes: 62 additions & 2 deletions modules/apps/29-fee/keeper/grpc_query.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,65 @@
package keeper

// TODO
import (
"context"

//var _ types.QueryServer = Keeper{}
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/types/query"

"github.com/cosmos/ibc-go/modules/apps/29-fee/types"
charleenfei marked this conversation as resolved.
Show resolved Hide resolved
)

var _ types.QueryServer = Keeper{}

// IncentivizedPackets implements the IncentivizedPackets gRPC method
func (k Keeper) IncentivizedPackets(c context.Context, req *types.QueryIncentivizedPacketsRequest) (*types.QueryIncentivizedPacketsResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "empty request")
}

ctx := sdk.UnwrapSDKContext(c).WithBlockHeight(int64(req.QueryHeight))

var packets []*types.IdentifiedPacketFee
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.FeeInEscrowPrefix))
_, err := query.Paginate(store, req.Pagination, func(_, value []byte) error {
result := k.MustUnmarshalFee(value)
packets = append(packets, &result)
return nil
})

if err != nil {
return nil, status.Error(
codes.NotFound, err.Error(),
)
}

return &types.QueryIncentivizedPacketsResponse{
IncentivizedPackets: packets,
}, nil
}

// IncentivizedPacket implements the IncentivizedPacket gRPC method
func (k Keeper) IncentivizedPacket(c context.Context, req *types.QueryIncentivizedPacketRequest) (*types.QueryIncentivizedPacketResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "empty request")
}

ctx := sdk.UnwrapSDKContext(c).WithBlockHeight(int64(req.QueryHeight))

fee, exists := k.GetFeeInEscrow(ctx, req.PacketId)
if !exists {
return nil, status.Error(
codes.NotFound,
sdkerrors.Wrap(types.ErrFeeNotFound, req.PacketId.String()).Error(),
)
}

return &types.QueryIncentivizedPacketResponse{
IncentivizedPacket: &fee,
}, nil
}
151 changes: 151 additions & 0 deletions modules/apps/29-fee/keeper/grpc_query_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package keeper_test

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/query"

"github.com/cosmos/ibc-go/modules/apps/29-fee/types"
ibctesting "github.com/cosmos/ibc-go/testing"
)

func (suite *KeeperTestSuite) TestQueryIncentivizedPacket() {

var (
req *types.QueryIncentivizedPacketRequest
)

// setup
validPacketId := types.NewPacketId(ibctesting.FirstChannelID, 1)
invalidPacketId := types.NewPacketId(ibctesting.FirstChannelID, 2)
identifiedPacketFee := types.NewIdentifiedPacketFee(
validPacketId,
types.Fee{
AckFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
ReceiveFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
TimeoutFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))),
},
[]string(nil),
)

testCases := []struct {
name string
malleate func()
expPass bool
}{
{
"success",
func() {
req = &types.QueryIncentivizedPacketRequest{
PacketId: validPacketId,
QueryHeight: 0,
}
},
true,
},
{
"packetId not found",
func() {
req = &types.QueryIncentivizedPacketRequest{
PacketId: invalidPacketId,
QueryHeight: 0,
}
},
false,
},
}

for _, tc := range testCases {
suite.Run(tc.name, func() {
suite.SetupTest() // reset

refundAcc := suite.chainA.SenderAccount.GetAddress()

tc.malleate()
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())
suite.chainA.GetSimApp().IBCFeeKeeper.EscrowPacketFee(suite.chainA.GetContext(), refundAcc, identifiedPacketFee)
res, err := suite.queryClient.IncentivizedPacket(ctx, req)

if tc.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(res)
suite.Require().Equal(identifiedPacketFee, res.IncentivizedPacket)
} else {
suite.Require().Error(err)
}
})
}
}

func (suite *KeeperTestSuite) TestQueryIncentivizedPackets() {
var (
req *types.QueryIncentivizedPacketsRequest
expPackets []*types.IdentifiedPacketFee
)

fee := types.Fee{
AckFee: sdk.Coins{sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: sdk.NewInt(100)}},
ReceiveFee: sdk.Coins{sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: sdk.NewInt(100)}},
TimeoutFee: sdk.Coins{sdk.Coin{Denom: sdk.DefaultBondDenom, Amount: sdk.NewInt(100)}},
}

testCases := []struct {
msg string
malleate func()
expPass bool
}{
{
"empty pagination",
func() {
req = &types.QueryIncentivizedPacketsRequest{}
},
true,
},
{
"success",
func() {
refundAcc := suite.chainA.SenderAccount.GetAddress()

fee1 := types.NewIdentifiedPacketFee(types.NewPacketId(ibctesting.FirstChannelID, 1), fee, []string(nil))
fee2 := types.NewIdentifiedPacketFee(types.NewPacketId(ibctesting.FirstChannelID, 2), fee, []string(nil))
fee3 := types.NewIdentifiedPacketFee(types.NewPacketId(ibctesting.FirstChannelID, 3), fee, []string(nil))

expPackets = []*types.IdentifiedPacketFee{}
expPackets = append(expPackets, fee1, fee2, fee3)

for _, p := range expPackets {
suite.chainA.GetSimApp().IBCFeeKeeper.EscrowPacketFee(suite.chainA.GetContext(), refundAcc, p)
}

req = &types.QueryIncentivizedPacketsRequest{
Pagination: &query.PageRequest{
Limit: 5,
CountTotal: false,
},
QueryHeight: 0,
}
},
true,
},
}

for _, tc := range testCases {
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
suite.SetupTest() // reset
tc.malleate()
ctx := sdk.WrapSDKContext(suite.chainA.GetContext())

res, err := suite.queryClient.IncentivizedPackets(ctx, req)

if tc.expPass {
suite.Require().NoError(err)
suite.Require().NotNil(res)
fmt.Println(expPackets)
suite.Require().Equal(expPackets, res.IncentivizedPackets)
} else {
suite.Require().Error(err)
}
})
}
}
Loading