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(cross-chain): add callbackGasPrice to cross-chain package #121

Merged
merged 2 commits into from
Mar 9, 2023
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
1 change: 0 additions & 1 deletion math/uint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -370,5 +370,4 @@ func (s *uintTestSuite) TestUintBigEndian() {
u2 = u2.SetBytes(u1b)

s.Require().Equal(u1, u2)

}
16 changes: 8 additions & 8 deletions proto/cosmos/auth/v1beta1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ service Query {
option (google.api.http).get = "/cosmos/auth/v1beta1/module_accounts/{name}";
}

// // Bech32Prefix queries bech32Prefix
// //
// // Since: cosmos-sdk 0.46
// rpc Bech32Prefix(Bech32PrefixRequest) returns (Bech32PrefixResponse) {
// option (google.api.http).get = "/cosmos/auth/v1beta1/bech32";
// }
// // Bech32Prefix queries bech32Prefix
// //
// // Since: cosmos-sdk 0.46
// rpc Bech32Prefix(Bech32PrefixRequest) returns (Bech32PrefixResponse) {
// option (google.api.http).get = "/cosmos/auth/v1beta1/bech32";
// }

// AddressBytesToString converts Account Address bytes to string
//
Expand Down Expand Up @@ -138,12 +138,12 @@ message QueryModuleAccountByNameResponse {
//// Bech32PrefixRequest is the request type for Bech32Prefix rpc method.
////
//// Since: cosmos-sdk 0.46
//message Bech32PrefixRequest {}
// message Bech32PrefixRequest {}

//// Bech32PrefixResponse is the response type for Bech32Prefix rpc method.
////
//// Since: cosmos-sdk 0.46
//message Bech32PrefixResponse {
// message Bech32PrefixResponse {
// string bech32_prefix = 1;
//}

Expand Down
2 changes: 2 additions & 0 deletions proto/cosmos/crosschain/v1/event.proto
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ message EventCrossChain {
string relayer_fee = 8;
// Relayer fee for the ACK or FAIL_ACK package of this cross chain package
string ack_relayer_fee = 9;
// Callback gas price the ACK or FAIL_ACK package
string callback_gas_price = 10;
}
2 changes: 1 addition & 1 deletion proto/cosmos/crosschain/v1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ message QueryParamsResponse {
// QueryCrossChainPackageRequest is the request type for the Query/CrossChainPackage RPC method.
message QueryCrossChainPackageRequest {
uint32 channel_id = 1;
uint64 sequence = 2;
uint64 sequence = 2;
}

// QueryCrossChainPackageResponse is the response type for the Query/CrossChainPackage RPC method.
Expand Down
2 changes: 1 addition & 1 deletion proto/cosmos/crypto/eth/bls/keys.proto
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import "gogoproto/gogo.proto";
option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/eth/bls";

// PubKey defines a bls public key
// Key is the compressed form of the pubkey.
// Key is the compressed form of the pubkey.
message PubKey {
option (gogoproto.goproto_stringer) = false;

Expand Down
8 changes: 4 additions & 4 deletions proto/cosmos/gashub/v1alpha1/gashub.proto
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ message Params {

// MsgGasParams defines gas for a msg type
message MsgGasParams {
option (gogoproto.equal) = true;
option (gogoproto.equal) = true;

string msg_type_url = 1 [(gogoproto.customname) = "MsgTypeUrl"];
string msg_type_url = 1 [(gogoproto.customname) = "MsgTypeUrl"];
// gas_params is the oneof that represents either fixed_gas_params or dynamic_gas_params
oneof gas_params {
// fixed_type specifies fixed type gas params.
Expand All @@ -34,14 +34,14 @@ message MsgGasParams {
}
// FixedGasParams defines the parameters for fixed gas type.
message FixedGasParams {
option (gogoproto.equal) = true;
option (gogoproto.equal) = true;

uint64 fixed_gas = 1 [(gogoproto.customname) = "FixedGas"];
}

// DynamicGasParams defines the parameters for dynamic gas type.
message DynamicGasParams {
option (gogoproto.equal) = true;
option (gogoproto.equal) = true;

uint64 fixed_gas = 1 [(gogoproto.customname) = "FixedGas"];
uint64 gas_per_item = 2 [(gogoproto.customname) = "GasPerItem"];
Expand Down
2 changes: 1 addition & 1 deletion proto/cosmos/gashub/v1alpha1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ message MsgUpdateMsgGasParams {
option (gogoproto.equal) = false;
option (gogoproto.goproto_getters) = false;

string from = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string from = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
repeated MsgGasParams new_params_set = 2;
}

Expand Down
3 changes: 2 additions & 1 deletion proto/cosmos/oracle/v1/event.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
syntax = "proto3";
package cosmos.oracle.v1;


option go_package = "github.com/cosmos/cosmos-sdk/x/oracle/types";

// EventPackageClaim is emitted when a cross chain package is processed
Expand All @@ -27,4 +26,6 @@ message EventPackageClaim {
string relayer_fee = 9;
// Relayer fee paid for the ACK or FAIL_ACK package
string ack_relayer_fee = 10;
// Callback gas price the ACK or FAIL_ACK package
string callback_gas_price = 11;
}
16 changes: 8 additions & 8 deletions proto/cosmos/oracle/v1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ message MsgClaim {
option (gogoproto.equal) = false;
option (gogoproto.goproto_getters) = false;

string from_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
uint32 src_chain_id = 2;
uint32 dest_chain_id = 3;
uint64 sequence = 4;
uint64 timestamp = 5;
bytes payload = 6;
repeated fixed64 vote_address_set = 7;
bytes agg_signature = 8;
string from_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
uint32 src_chain_id = 2;
uint32 dest_chain_id = 3;
uint64 sequence = 4;
uint64 timestamp = 5;
bytes payload = 6;
repeated fixed64 vote_address_set = 7;
bytes agg_signature = 8;
}

// MsgClaimResponse defines the Msg/Claim response type
Expand Down
4 changes: 2 additions & 2 deletions proto/cosmos/params/v1beta1/params.proto
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ message ParameterChangeProposal {
string title = 1;
string description = 2;
repeated ParamChange changes = 3 [(gogoproto.nullable) = false];
bool cross_chain = 4; // flag for cross chain proposal
repeated string addresses = 5; // used with cross_chain field to specify destination smart contract address(es)
bool cross_chain = 4; // flag for cross chain proposal
repeated string addresses = 5; // used with cross_chain field to specify destination smart contract address(es)
}

// ParamChange defines an individual parameter change, for use in
Expand Down
4 changes: 2 additions & 2 deletions proto/cosmos/slashing/v1beta1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ message MsgImpeach {
option (gogoproto.equal) = false;
option (gogoproto.goproto_getters) = false;

string from = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string from = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
}

// MsgImpeachResponse defines the Msg/Impeach response type.
Expand Down
6 changes: 3 additions & 3 deletions proto/cosmos/staking/v1beta1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ message MsgCreateValidator {

string from = 8 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string relayer_address = 9 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string relayer_bls_key = 10;
string relayer_bls_key = 10;
}

// MsgCreateValidatorResponse defines the Msg/CreateValidator response type.
Expand All @@ -87,8 +87,8 @@ message MsgEditValidator {
string min_self_delegation = 4
[(cosmos_proto.scalar) = "cosmos.Int", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int"];

string relayer_address = 5 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string relayer_bls_key = 6; // The BLS pubkey for the authorized relayer
string relayer_address = 5 [(cosmos_proto.scalar) = "cosmos.AddressString"];
string relayer_bls_key = 6; // The BLS pubkey for the authorized relayer
}

// MsgEditValidatorResponse defines the Msg/EditValidator response type.
Expand Down
12 changes: 6 additions & 6 deletions proto/cosmos/tx/v1beta1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -102,30 +102,30 @@ message SignDocEip712 {
// chain_id is the identifier of the chain this transaction targets.
// It prevents signed transactions from being used on another chain by an
// attacker.
uint64 chain_id = 1[(gogoproto.jsontag) = "chain_id"];
uint64 chain_id = 1 [(gogoproto.jsontag) = "chain_id"];

// account_number is the account number of the account in state.
uint64 account_number = 2[(gogoproto.jsontag) = "account_number"];
uint64 account_number = 2 [(gogoproto.jsontag) = "account_number"];

// sequence is the sequence number of the signing account.
uint64 sequence = 3[(gogoproto.jsontag) = "sequence"];
uint64 sequence = 3 [(gogoproto.jsontag) = "sequence"];

// Fee is the fee and gas limit for the transaction. The first signer is the
// primary signer and the one which pays the fee. The fee can be calculated
// based on the cost of evaluating the body and doing signature verification
// of the signers. This can be estimated via simulation.
Fee fee = 4[(gogoproto.nullable) = false];
Fee fee = 4 [(gogoproto.nullable) = false];

// msg is the msg in the EIP712 transaction.
google.protobuf.Any msg = 5;

// timeout_height is the transaction's timeout height (if set).
uint64 timeout_height = 6[(gogoproto.jsontag) = "timeout_height"];
uint64 timeout_height = 6 [(gogoproto.jsontag) = "timeout_height"];

// memo is any arbitrary note/comment to be added to the transaction.
// WARNING: in clients, any publicly exposed text should not be called memo,
// but should be called `note` instead (see https://github.com/cosmos/cosmos-sdk/issues/9122).
string memo = 7[(gogoproto.jsontag) = "memo"];
string memo = 7 [(gogoproto.jsontag) = "memo"];

// Tip is the optional tip used for transactions fees paid in another denom.
// It should be left empty if the signer is not the tipper for this
Expand Down
34 changes: 22 additions & 12 deletions types/cross_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@ func (c ExecuteResult) ErrMsg() string {
}

const (
CrossChainFeeLength = 32
PackageTypeLength = 1
TimestampLength = 8
CrossChainFeeLength = 32
CallbackGasPriceLength = 32
PackageTypeLength = 1
TimestampLength = 8

SynPackageHeaderLength = 2*CrossChainFeeLength + TimestampLength + PackageTypeLength
SynPackageHeaderLength = 2*CrossChainFeeLength + CallbackGasPriceLength + TimestampLength + PackageTypeLength
AckPackageHeaderLength = CrossChainFeeLength + TimestampLength + PackageTypeLength
)

Expand All @@ -80,10 +81,14 @@ type PackageHeader struct {
RelayerFee *big.Int // relayer fee is the relayer fee paid to relayer src source chain to dest chain
// ack relayer fee is the relayer fee paid to relayer for the ack or fail ack package if there is any
// Ack and FailAck packages don't have ack relayer fee, since there is no corresponding ack or fail ack packages
AckRelayerFee *big.Int
AckRelayerFee *big.Int
CallbackGasPrice *big.Int
}

var NilAckRelayerFee = big.NewInt(0) // For ack packages, the ack relayer fee should be nil, and it would not be encoded into package header
var (
NilAckRelayerFee = big.NewInt(0) // For ack packages, the ack relayer fee should be nil, and it would not be encoded into package header
NilCallbackGasPrice = big.NewInt(0) // For ack packages, the callback gas price should be nil, and it would not be encoded into package header
)

func EncodePackageHeader(header PackageHeader) []byte {
packageHeader := make([]byte, GetPackageHeaderLength(header.PackageType))
Expand All @@ -99,7 +104,10 @@ func EncodePackageHeader(header PackageHeader) []byte {
// add ack relayer fee to header for syn package
if header.PackageType == SynCrossChainPackageType {
ackRelayerFeeLength := len(header.AckRelayerFee.Bytes())
copy(packageHeader[SynPackageHeaderLength-ackRelayerFeeLength:SynPackageHeaderLength], header.AckRelayerFee.Bytes())
copy(packageHeader[AckPackageHeaderLength:AckPackageHeaderLength+ackRelayerFeeLength], header.AckRelayerFee.Bytes())

callbackGasPriceLength := len(header.CallbackGasPrice.Bytes())
copy(packageHeader[SynPackageHeaderLength-callbackGasPriceLength:SynPackageHeaderLength], header.CallbackGasPrice.Bytes())
}

return packageHeader
Expand All @@ -126,14 +134,16 @@ func DecodePackageHeader(packageHeader []byte) (PackageHeader, error) {
relayerFee := big.NewInt(0).SetBytes(packageHeader[PackageTypeLength+TimestampLength : AckPackageHeaderLength])

header := PackageHeader{
PackageType: packageType,
Timestamp: timestamp,
RelayerFee: relayerFee,
AckRelayerFee: big.NewInt(0),
PackageType: packageType,
Timestamp: timestamp,
RelayerFee: relayerFee,
AckRelayerFee: big.NewInt(0),
CallbackGasPrice: big.NewInt(0),
}

if packageType == SynCrossChainPackageType {
header.AckRelayerFee = big.NewInt(0).SetBytes(packageHeader[AckPackageHeaderLength:SynPackageHeaderLength])
header.AckRelayerFee = big.NewInt(0).SetBytes(packageHeader[AckPackageHeaderLength : AckPackageHeaderLength+CrossChainFeeLength])
header.CallbackGasPrice = big.NewInt(0).SetBytes(packageHeader[SynPackageHeaderLength-CallbackGasPriceLength : SynPackageHeaderLength])
}

return header, nil
Expand Down
2 changes: 1 addition & 1 deletion x/auth/tx/eip712_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package tx
import (
"fmt"
"testing"
"time"

"github.com/stretchr/testify/require"

Expand All @@ -19,7 +20,6 @@ import (
"github.com/cosmos/cosmos-sdk/x/feegrant"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
"github.com/cosmos/cosmos-sdk/x/group"
"time"
)

func TestEIP712Handler(t *testing.T) {
Expand Down
30 changes: 16 additions & 14 deletions x/crosschain/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func (k Keeper) SetParams(ctx sdk.Context, params types.Params) {

// CreateRawIBCPackageWithFee creates a cross chain package with given cross chain fee
func (k Keeper) CreateRawIBCPackageWithFee(ctx sdk.Context, channelID sdk.ChannelID,
packageType sdk.CrossChainPackageType, packageLoad []byte, relayerFee *big.Int, ackRelayerFee *big.Int,
packageType sdk.CrossChainPackageType, packageLoad []byte, relayerFee *big.Int, ackRelayerFee *big.Int, callbackGasPrice *big.Int,
) (uint64, error) {
if packageType == sdk.SynCrossChainPackageType && k.GetChannelSendPermission(ctx, k.GetDestChainID(), channelID) != sdk.ChannelAllow {
return 0, fmt.Errorf("channel %d is not allowed to write syn package", channelID)
Expand All @@ -96,26 +96,28 @@ func (k Keeper) CreateRawIBCPackageWithFee(ctx sdk.Context, channelID sdk.Channe

// Assemble the package header
packageHeader := sdk.EncodePackageHeader(sdk.PackageHeader{
PackageType: packageType,
Timestamp: uint64(ctx.BlockTime().Unix()),
RelayerFee: relayerFee,
AckRelayerFee: ackRelayerFee,
PackageType: packageType,
Timestamp: uint64(ctx.BlockTime().Unix()),
RelayerFee: relayerFee,
AckRelayerFee: ackRelayerFee,
CallbackGasPrice: callbackGasPrice,
})

kvStore.Set(key, append(packageHeader, packageLoad...))

k.IncrSendSequence(ctx, channelID)

err := ctx.EventManager().EmitTypedEvent(&types.EventCrossChain{
SrcChainId: uint32(k.GetSrcChainID()),
DestChainId: uint32(k.GetDestChainID()),
ChannelId: uint32(channelID),
Sequence: sequence,
PackageType: uint32(packageType),
Timestamp: uint64(ctx.BlockTime().Unix()),
PackageLoad: hex.EncodeToString(packageLoad),
RelayerFee: relayerFee.String(),
AckRelayerFee: ackRelayerFee.String(),
SrcChainId: uint32(k.GetSrcChainID()),
DestChainId: uint32(k.GetDestChainID()),
ChannelId: uint32(channelID),
Sequence: sequence,
PackageType: uint32(packageType),
Timestamp: uint64(ctx.BlockTime().Unix()),
PackageLoad: hex.EncodeToString(packageLoad),
RelayerFee: relayerFee.String(),
AckRelayerFee: ackRelayerFee.String(),
CallbackGasPrice: callbackGasPrice.String(),
})
if err != nil {
return 0, err
Expand Down
Loading