Skip to content

Commit

Permalink
[TRA-434] Governance msg MsgSetMarketMapperRevShareDetailsForMarket (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyaoy committed Jul 1, 2024
1 parent 432e711 commit c06db6f
Show file tree
Hide file tree
Showing 10 changed files with 749 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Rpc } from "../../helpers";
import * as _m0 from "protobufjs/minimal";
import { MsgSetMarketMapperRevenueShare, MsgSetMarketMapperRevenueShareResponse } from "./tx";
import { MsgSetMarketMapperRevenueShare, MsgSetMarketMapperRevenueShareResponse, MsgSetMarketMapperRevShareDetailsForMarket, MsgSetMarketMapperRevShareDetailsForMarketResponse } from "./tx";
/** Msg defines the Msg service. */

export interface Msg {
Expand All @@ -9,13 +9,20 @@ export interface Msg {
* mapper.
*/
setMarketMapperRevenueShare(request: MsgSetMarketMapperRevenueShare): Promise<MsgSetMarketMapperRevenueShareResponse>;
/**
* SetMarketMapperRevenueShareDetails sets the revenue share details for a
* market mapper.
*/

setMarketMapperRevShareDetailsForMarket(request: MsgSetMarketMapperRevShareDetailsForMarket): Promise<MsgSetMarketMapperRevShareDetailsForMarketResponse>;
}
export class MsgClientImpl implements Msg {
private readonly rpc: Rpc;

constructor(rpc: Rpc) {
this.rpc = rpc;
this.setMarketMapperRevenueShare = this.setMarketMapperRevenueShare.bind(this);
this.setMarketMapperRevShareDetailsForMarket = this.setMarketMapperRevShareDetailsForMarket.bind(this);
}

setMarketMapperRevenueShare(request: MsgSetMarketMapperRevenueShare): Promise<MsgSetMarketMapperRevenueShareResponse> {
Expand All @@ -24,4 +31,10 @@ export class MsgClientImpl implements Msg {
return promise.then(data => MsgSetMarketMapperRevenueShareResponse.decode(new _m0.Reader(data)));
}

setMarketMapperRevShareDetailsForMarket(request: MsgSetMarketMapperRevShareDetailsForMarket): Promise<MsgSetMarketMapperRevShareDetailsForMarketResponse> {
const data = MsgSetMarketMapperRevShareDetailsForMarket.encode(request).finish();
const promise = this.rpc.request("dydxprotocol.revshare.Msg", "SetMarketMapperRevShareDetailsForMarket", data);
return promise.then(data => MsgSetMarketMapperRevShareDetailsForMarketResponse.decode(new _m0.Reader(data)));
}

}
136 changes: 136 additions & 0 deletions indexer/packages/v4-protos/src/codegen/dydxprotocol/revshare/tx.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { MarketMapperRevenueShareParams, MarketMapperRevenueShareParamsSDKType } from "./params";
import { MarketMapperRevShareDetails, MarketMapperRevShareDetailsSDKType } from "./revshare";
import * as _m0 from "protobufjs/minimal";
import { DeepPartial } from "../../helpers";
/** Message to set the market mapper revenue share */
Expand All @@ -23,6 +24,42 @@ export interface MsgSetMarketMapperRevenueShareResponse {}
/** Response to a MsgSetMarketMapperRevenueShare */

export interface MsgSetMarketMapperRevenueShareResponseSDKType {}
/**
* Msg to set market mapper revenue share details (e.g. expiration timestamp)
* for a specific market. To be used as an override for existing revenue share
* settings set by the MsgSetMarketMapperRevenueShare msg
*/

export interface MsgSetMarketMapperRevShareDetailsForMarket {
authority: string;
/** The market ID for which to set the revenue share details */

marketId: number;
/** Parameters for the revenue share details */

params?: MarketMapperRevShareDetails;
}
/**
* Msg to set market mapper revenue share details (e.g. expiration timestamp)
* for a specific market. To be used as an override for existing revenue share
* settings set by the MsgSetMarketMapperRevenueShare msg
*/

export interface MsgSetMarketMapperRevShareDetailsForMarketSDKType {
authority: string;
/** The market ID for which to set the revenue share details */

market_id: number;
/** Parameters for the revenue share details */

params?: MarketMapperRevShareDetailsSDKType;
}
/** Response to a MsgSetMarketMapperRevShareDetailsForMarket */

export interface MsgSetMarketMapperRevShareDetailsForMarketResponse {}
/** Response to a MsgSetMarketMapperRevShareDetailsForMarket */

export interface MsgSetMarketMapperRevShareDetailsForMarketResponseSDKType {}

function createBaseMsgSetMarketMapperRevenueShare(): MsgSetMarketMapperRevenueShare {
return {
Expand Down Expand Up @@ -111,4 +148,103 @@ export const MsgSetMarketMapperRevenueShareResponse = {
return message;
}

};

function createBaseMsgSetMarketMapperRevShareDetailsForMarket(): MsgSetMarketMapperRevShareDetailsForMarket {
return {
authority: "",
marketId: 0,
params: undefined
};
}

export const MsgSetMarketMapperRevShareDetailsForMarket = {
encode(message: MsgSetMarketMapperRevShareDetailsForMarket, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.authority !== "") {
writer.uint32(10).string(message.authority);
}

if (message.marketId !== 0) {
writer.uint32(16).uint32(message.marketId);
}

if (message.params !== undefined) {
MarketMapperRevShareDetails.encode(message.params, writer.uint32(26).fork()).ldelim();
}

return writer;
},

decode(input: _m0.Reader | Uint8Array, length?: number): MsgSetMarketMapperRevShareDetailsForMarket {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseMsgSetMarketMapperRevShareDetailsForMarket();

while (reader.pos < end) {
const tag = reader.uint32();

switch (tag >>> 3) {
case 1:
message.authority = reader.string();
break;

case 2:
message.marketId = reader.uint32();
break;

case 3:
message.params = MarketMapperRevShareDetails.decode(reader, reader.uint32());
break;

default:
reader.skipType(tag & 7);
break;
}
}

return message;
},

fromPartial(object: DeepPartial<MsgSetMarketMapperRevShareDetailsForMarket>): MsgSetMarketMapperRevShareDetailsForMarket {
const message = createBaseMsgSetMarketMapperRevShareDetailsForMarket();
message.authority = object.authority ?? "";
message.marketId = object.marketId ?? 0;
message.params = object.params !== undefined && object.params !== null ? MarketMapperRevShareDetails.fromPartial(object.params) : undefined;
return message;
}

};

function createBaseMsgSetMarketMapperRevShareDetailsForMarketResponse(): MsgSetMarketMapperRevShareDetailsForMarketResponse {
return {};
}

export const MsgSetMarketMapperRevShareDetailsForMarketResponse = {
encode(_: MsgSetMarketMapperRevShareDetailsForMarketResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
return writer;
},

decode(input: _m0.Reader | Uint8Array, length?: number): MsgSetMarketMapperRevShareDetailsForMarketResponse {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseMsgSetMarketMapperRevShareDetailsForMarketResponse();

while (reader.pos < end) {
const tag = reader.uint32();

switch (tag >>> 3) {
default:
reader.skipType(tag & 7);
break;
}
}

return message;
},

fromPartial(_: DeepPartial<MsgSetMarketMapperRevShareDetailsForMarketResponse>): MsgSetMarketMapperRevShareDetailsForMarketResponse {
const message = createBaseMsgSetMarketMapperRevShareDetailsForMarketResponse();
return message;
}

};
26 changes: 26 additions & 0 deletions proto/dydxprotocol/revshare/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import "cosmos_proto/cosmos.proto";
import "cosmos/msg/v1/msg.proto";
import "gogoproto/gogo.proto";
import "dydxprotocol/revshare/params.proto";
import "dydxprotocol/revshare/revshare.proto";

option go_package = "github.com/dydxprotocol/v4-chain/protocol/x/revshare/types";

Expand All @@ -14,6 +15,12 @@ service Msg {
// mapper.
rpc SetMarketMapperRevenueShare(MsgSetMarketMapperRevenueShare)
returns (MsgSetMarketMapperRevenueShareResponse);

// SetMarketMapperRevenueShareDetails sets the revenue share details for a
// market mapper.
rpc SetMarketMapperRevShareDetailsForMarket(
MsgSetMarketMapperRevShareDetailsForMarket)
returns (MsgSetMarketMapperRevShareDetailsForMarketResponse);
}

// Message to set the market mapper revenue share
Expand All @@ -29,3 +36,22 @@ message MsgSetMarketMapperRevenueShare {

// Response to a MsgSetMarketMapperRevenueShare
message MsgSetMarketMapperRevenueShareResponse {}

// Msg to set market mapper revenue share details (e.g. expiration timestamp)
// for a specific market. To be used as an override for existing revenue share
// settings set by the MsgSetMarketMapperRevenueShare msg
message MsgSetMarketMapperRevShareDetailsForMarket {
// The address that controls the module (the gov module account).
option (cosmos.msg.v1.signer) = "authority";

string authority = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

// The market ID for which to set the revenue share details
uint32 market_id = 2;

// Parameters for the revenue share details
MarketMapperRevShareDetails params = 3 [ (gogoproto.nullable) = false ];
}

// Response to a MsgSetMarketMapperRevShareDetailsForMarket
message MsgSetMarketMapperRevShareDetailsForMarketResponse {}
6 changes: 4 additions & 2 deletions protocol/app/msgs/all_msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,10 @@ var (
"/dydxprotocol.vest.MsgDeleteVestEntryResponse": {},

// revshare
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShare": {},
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShareResponse": {},
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShare": {},
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShareResponse": {},
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarket": {},
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarketResponse": {},

// rewards
"/dydxprotocol.rewards.MsgUpdateParams": {},
Expand Down
6 changes: 4 additions & 2 deletions protocol/app/msgs/internal_msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,10 @@ var (
"/dydxprotocol.ratelimit.MsgSetLimitParamsResponse": nil,

// revshare
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShare": &revshare.MsgSetMarketMapperRevenueShare{},
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShareResponse": nil,
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarket": &revshare.MsgSetMarketMapperRevShareDetailsForMarket{}, //nolint:lll
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarketResponse": nil,
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShare": &revshare.MsgSetMarketMapperRevenueShare{}, //nolint:lll
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShareResponse": nil,

// rewards
"/dydxprotocol.rewards.MsgUpdateParams": &rewards.MsgUpdateParams{},
Expand Down
2 changes: 2 additions & 0 deletions protocol/app/msgs/internal_msgs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ func TestInternalMsgSamples_Gov_Key(t *testing.T) {
"/dydxprotocol.ratelimit.MsgSetLimitParamsResponse",

// revshare
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarket",
"/dydxprotocol.revshare.MsgSetMarketMapperRevShareDetailsForMarketResponse",
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShare",
"/dydxprotocol.revshare.MsgSetMarketMapperRevenueShareResponse",

Expand Down
1 change: 1 addition & 0 deletions protocol/lib/ante/internal_msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ func IsInternalMsg(msg sdk.Msg) bool {

// revshare
*revshare.MsgSetMarketMapperRevenueShare,
*revshare.MsgSetMarketMapperRevShareDetailsForMarket,

// rewards
*rewards.MsgUpdateParams,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package keeper

import (
"context"

errorsmod "cosmossdk.io/errors"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/dydxprotocol/v4-chain/protocol/x/revshare/types"
)

func (k msgServer) SetMarketMapperRevShareDetailsForMarket(
goCtx context.Context,
msg *types.MsgSetMarketMapperRevShareDetailsForMarket,
) (*types.MsgSetMarketMapperRevShareDetailsForMarketResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)

// Check if sender is authorized to set revenue share
if !k.HasAuthority(msg.Authority) {
return nil, errorsmod.Wrapf(
govtypes.ErrInvalidSigner,
"invalid authority %s",
msg.Authority,
)
}

// We do not validate if the market exists in x/prices here because that
// creates a circular dependency between x/prices and x/revshare. We can
// assume that governance provides a strong safety check for this

// Set market mapper revenue share details
k.SetMarketMapperRevShareDetails(ctx, msg.MarketId, msg.Params)

return &types.MsgSetMarketMapperRevShareDetailsForMarketResponse{}, nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package keeper_test

import (
"testing"

testapp "github.com/dydxprotocol/v4-chain/protocol/testutil/app"
"github.com/dydxprotocol/v4-chain/protocol/x/revshare/keeper"
"github.com/stretchr/testify/require"

"github.com/dydxprotocol/v4-chain/protocol/lib"
"github.com/dydxprotocol/v4-chain/protocol/testutil/constants"
"github.com/dydxprotocol/v4-chain/protocol/x/revshare/types"
)

func TestSetMarketMapperRevenueShareDetailsForMarket(t *testing.T) {
tests := map[string]struct {
// Msg
msg *types.MsgSetMarketMapperRevShareDetailsForMarket
// Expected error
expectedErr string
}{
"Success - Set revenue share details for market": {
msg: &types.MsgSetMarketMapperRevShareDetailsForMarket{
Authority: lib.GovModuleAddress.String(),
MarketId: constants.MarketId0,
Params: types.MarketMapperRevShareDetails{
ExpirationTs: 100,
},
},
expectedErr: "",
},
"Failure - Invalid Authority": {
msg: &types.MsgSetMarketMapperRevShareDetailsForMarket{
Authority: constants.AliceAccAddress.String(),
MarketId: constants.MarketId0,
Params: types.MarketMapperRevShareDetails{
ExpirationTs: 100,
},
},
expectedErr: "invalid authority",
},
"Failure - Empty Authority": {
msg: &types.MsgSetMarketMapperRevShareDetailsForMarket{
MarketId: constants.MarketId0,
Params: types.MarketMapperRevShareDetails{
ExpirationTs: 100,
},
},
expectedErr: "invalid authority",
},
}

for name, tc := range tests {
t.Run(
name, func(t *testing.T) {
tApp := testapp.NewTestAppBuilder(t).Build()
ctx := tApp.InitChain()
k := tApp.App.RevShareKeeper
ms := keeper.NewMsgServerImpl(k)
_, err := ms.SetMarketMapperRevShareDetailsForMarket(ctx, tc.msg)
if tc.expectedErr != "" {
require.Error(t, err)
require.Contains(t, err.Error(), tc.expectedErr)
} else {
require.NoError(t, err)
revShareDetails, _ := k.GetMarketMapperRevShareDetails(ctx, tc.msg.MarketId)
require.Equal(t, tc.msg.Params, revShareDetails)
}
},
)
}
}
Loading

0 comments on commit c06db6f

Please sign in to comment.