Skip to content

Commit 208a1df

Browse files
committed
add param and tx for rowan collateral
1 parent a0920e5 commit 208a1df

File tree

13 files changed

+639
-119
lines changed

13 files changed

+639
-119
lines changed

proto/sifnode/margin/v1/tx.proto

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ service Msg {
1212
rpc ForceClose(MsgForceClose) returns (MsgForceCloseResponse) {}
1313
rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse) {}
1414
rpc UpdatePools(MsgUpdatePools) returns (MsgUpdatePoolsResponse) {}
15+
rpc UpdateRowanCollateral(MsgUpdateRowanCollateral) returns (MsgUpdateRowanCollateralResponse) {}
1516
rpc Whitelist(MsgWhitelist) returns (MsgWhitelistResponse) {}
1617
rpc Dewhitelist(MsgDewhitelist) returns (MsgDewhitelistResponse) {}
1718
rpc AdminClose(MsgAdminClose) returns (MsgAdminCloseResponse) {}
@@ -65,6 +66,13 @@ message MsgUpdatePools {
6566

6667
message MsgUpdatePoolsResponse {}
6768

69+
message MsgUpdateRowanCollateral {
70+
string signer = 1;
71+
bool rowan_collateral_enabled = 2;
72+
}
73+
74+
message MsgUpdateRowanCollateralResponse {}
75+
6876
message MsgWhitelist {
6977
string signer = 1;
7078
string whitelisted_address = 2;

proto/sifnode/margin/v1/types.proto

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ message Params {
6363
repeated string closed_pools = 19;
6464
bool incremental_interest_payment_enabled = 20;
6565
bool whitelisting_enabled = 21;
66+
bool rowan_collateral_enabled = 22;
6667
}
6768

6869
enum Position {

tools/sifgen/common/types/genesis.go

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ type MarginParams struct {
186186
ClosedPools []string `json:"closed_pools"`
187187
IncrementalInterestPaymentEnabled bool `json:"incremental_interest_payment_enabled"`
188188
WhitelistingEnabled bool `json:"whitelisting_enabled"`
189+
RowanCollateralEnabled bool `json:"rowan_collateral_enabled"`
189190
}
190191

191192
type Dispensation struct {

tools/sifgen/genesis/genesis.go

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func ReplaceMarginGenesis(nodeHomeDir string) error {
154154
(*genesis).AppState.Margin.Params.ClosedPools = gen.Params.ClosedPools
155155
(*genesis).AppState.Margin.Params.IncrementalInterestPaymentEnabled = gen.Params.IncrementalInterestPaymentEnabled
156156
(*genesis).AppState.Margin.Params.WhitelistingEnabled = gen.Params.WhitelistingEnabled
157+
(*genesis).AppState.Margin.Params.RowanCollateralEnabled = gen.Params.RowanCollateralEnabled
157158

158159
content, err := tmjson.Marshal(genesis)
159160
if err != nil {

x/margin/client/cli/tx.go

+36
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func GetTxCmd() *cobra.Command {
2727
GetForceCloseCmd(),
2828
GetUpdateParamsCmd(),
2929
GetUpdatePoolsCmd(),
30+
GetUpdateRowanCollateralCmd(),
3031
GetDewhitelistCmd(),
3132
GetWhitelistCmd(),
3233
GetAdminCloseCmd(),
@@ -320,6 +321,41 @@ func readPoolsJSON(filename string) ([]string, error) {
320321
return pools, nil
321322
}
322323

324+
func GetUpdateRowanCollateralCmd() *cobra.Command {
325+
cmd := &cobra.Command{
326+
Use: "update-rowan-collateral",
327+
Short: "Enable or disable opening margin positions with rowan collateral.",
328+
RunE: func(cmd *cobra.Command, args []string) error {
329+
clientCtx, err := client.GetClientTxContext(cmd)
330+
if err != nil {
331+
return err
332+
}
333+
334+
signer := clientCtx.GetFromAddress()
335+
if signer == nil {
336+
return errors.New("signer address is missing")
337+
}
338+
339+
rowanCollateralEnabled := viper.GetBool("enabled")
340+
341+
msg := types.MsgUpdateRowanCollateral{
342+
Signer: signer.String(),
343+
RowanCollateralEnabled: rowanCollateralEnabled,
344+
}
345+
if err := msg.ValidateBasic(); err != nil {
346+
return err
347+
}
348+
349+
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
350+
},
351+
}
352+
cmd.Flags().Bool("enabled", true, "rowan collateral enabled for margin [bool]")
353+
_ = cmd.MarkFlagRequired("enabled")
354+
flags.AddTxFlagsToCmd(cmd)
355+
356+
return cmd
357+
}
358+
323359
func GetWhitelistCmd() *cobra.Command {
324360
cmd := &cobra.Command{
325361
Use: "whitelist [address]",

x/margin/keeper/legacy.go

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ func NewLegacyHandler(k types.Keeper) sdk.Handler {
4444
case *types.MsgUpdatePools:
4545
res, err := msgServer.UpdatePools(sdk.WrapSDKContext(ctx), msg)
4646
return sdk.WrapServiceResult(ctx, res, err)
47+
case *types.MsgUpdateRowanCollateral:
48+
res, err := msgServer.UpdateRowanCollateral(sdk.WrapSDKContext(ctx), msg)
49+
return sdk.WrapServiceResult(ctx, res, err)
4750
case *types.MsgWhitelist:
4851
res, err := msgServer.Whitelist(sdk.WrapSDKContext(ctx), msg)
4952
return sdk.WrapServiceResult(ctx, res, err)

x/margin/keeper/msg_server.go

+21
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ func (k msgServer) OpenLong(ctx sdk.Context, msg *types.MsgOpen) (*types.MTP, er
142142
var externalAsset string
143143
nativeAsset := types.GetSettlementAsset()
144144

145+
if !k.IsRowanCollateralEnabled(ctx) && types.StringCompare(msg.CollateralAsset, nativeAsset) {
146+
return nil, sdkerrors.Wrap(types.ErrRowanAsCollateralNotAllowed, nativeAsset)
147+
}
148+
145149
if types.StringCompare(msg.CollateralAsset, nativeAsset) {
146150
externalAsset = msg.BorrowAsset
147151
} else {
@@ -340,6 +344,23 @@ func (k msgServer) UpdatePools(goCtx context.Context, msg *types.MsgUpdatePools)
340344
return &types.MsgUpdatePoolsResponse{}, nil
341345
}
342346

347+
func (k msgServer) UpdateRowanCollateral(goCtx context.Context, msg *types.MsgUpdateRowanCollateral) (*types.MsgUpdateRowanCollateralResponse, error) {
348+
ctx := sdk.UnwrapSDKContext(goCtx)
349+
signer, err := sdk.AccAddressFromBech32(msg.Signer)
350+
if err != nil {
351+
return nil, err
352+
}
353+
if !k.AdminKeeper().IsAdminAccount(ctx, admintypes.AdminType_MARGIN, signer) {
354+
return nil, sdkerrors.Wrap(admintypes.ErrPermissionDenied, fmt.Sprintf("signer not authorised: %s", msg.Signer))
355+
}
356+
357+
params := k.GetParams(ctx)
358+
params.RowanCollateralEnabled = msg.RowanCollateralEnabled
359+
k.SetParams(ctx, &params)
360+
361+
return &types.MsgUpdateRowanCollateralResponse{}, nil
362+
}
363+
343364
func (k msgServer) Whitelist(goCtx context.Context, msg *types.MsgWhitelist) (*types.MsgWhitelistResponse, error) {
344365
ctx := sdk.UnwrapSDKContext(goCtx)
345366
signer, err := sdk.AccAddressFromBech32(msg.Signer)

x/margin/keeper/params.go

+4
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ func (k Keeper) IsWhitelistingEnabled(ctx sdk.Context) bool {
121121
return k.GetParams(ctx).WhitelistingEnabled
122122
}
123123

124+
func (k Keeper) IsRowanCollateralEnabled(ctx sdk.Context) bool {
125+
return k.GetParams(ctx).RowanCollateralEnabled
126+
}
127+
124128
func (k Keeper) SetParams(ctx sdk.Context, params *types.Params) {
125129
err := ValidateParams(params)
126130
if err != nil {

x/margin/types/expected_keepers.go

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ type Keeper interface {
7272
IsPoolEnabled(ctx sdk.Context, asset string) bool
7373
IsPoolClosed(ctx sdk.Context, asset string) bool
7474
IsWhitelistingEnabled(ctx sdk.Context) bool
75+
IsRowanCollateralEnabled(ctx sdk.Context) bool
7576

7677
CLPSwap(ctx sdk.Context, sentAmount sdk.Uint, to string, pool clptypes.Pool) (sdk.Uint, error)
7778
Borrow(ctx sdk.Context, collateralAsset string, collateralAmount sdk.Uint, custodyAmount sdk.Uint, mtp *MTP, pool *clptypes.Pool, eta sdk.Dec) error

x/margin/types/genesis.go

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func DefaultGenesis() *GenesisState {
2525
IncrementalInterestPaymentEnabled: true,
2626
ClosedPools: []string{},
2727
WhitelistingEnabled: false,
28+
RowanCollateralEnabled: true,
2829
},
2930
}
3031
}

x/margin/types/msgs.go

+29
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var (
1515
_ sdk.Msg = &MsgForceClose{}
1616
_ sdk.Msg = &MsgUpdateParams{}
1717
_ sdk.Msg = &MsgUpdatePools{}
18+
_ sdk.Msg = &MsgUpdateRowanCollateral{}
1819
_ sdk.Msg = &MsgDewhitelist{}
1920
_ sdk.Msg = &MsgWhitelist{}
2021
_ sdk.Msg = &MsgAdminClose{}
@@ -25,6 +26,7 @@ var (
2526
_ legacytx.LegacyMsg = &MsgForceClose{}
2627
_ legacytx.LegacyMsg = &MsgUpdateParams{}
2728
_ legacytx.LegacyMsg = &MsgUpdatePools{}
29+
_ legacytx.LegacyMsg = &MsgUpdateRowanCollateral{}
2830
_ legacytx.LegacyMsg = &MsgWhitelist{}
2931
_ legacytx.LegacyMsg = &MsgDewhitelist{}
3032
_ legacytx.LegacyMsg = &MsgAdminClose{}
@@ -211,6 +213,33 @@ func (m MsgUpdatePools) ValidateBasic() error {
211213
return nil
212214
}
213215

216+
func (m MsgUpdateRowanCollateral) GetSigners() []sdk.AccAddress {
217+
signer, err := sdk.AccAddressFromBech32(m.Signer)
218+
if err != nil {
219+
panic(err)
220+
}
221+
return []sdk.AccAddress{signer}
222+
}
223+
func (m MsgUpdateRowanCollateral) GetSignBytes() []byte {
224+
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m))
225+
}
226+
227+
func (m MsgUpdateRowanCollateral) Route() string {
228+
return RouterKey
229+
}
230+
231+
func (m MsgUpdateRowanCollateral) Type() string {
232+
return "update_rowan_collateral"
233+
}
234+
235+
func (m MsgUpdateRowanCollateral) ValidateBasic() error {
236+
if len(m.Signer) == 0 {
237+
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, m.Signer)
238+
}
239+
240+
return nil
241+
}
242+
214243
func (m MsgUpdatePools) GetSigners() []sdk.AccAddress {
215244
signer, err := sdk.AccAddressFromBech32(m.Signer)
216245
if err != nil {

0 commit comments

Comments
 (0)