Skip to content

Commit d686248

Browse files
committed
feat: using max price field for node lease and node session instead denom
1 parent 327a8c2 commit d686248

File tree

22 files changed

+382
-763
lines changed

22 files changed

+382
-763
lines changed

proto/sentinel/lease/v1/events.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ message EventPay {
2626
uint64 id = 1 [(gogoproto.customname) = "ID"];
2727
string node_address = 2;
2828
string prov_address = 3;
29-
string payment = 4;
29+
string amount = 4;
3030
string staking_reward = 5;
3131
}
3232

proto/sentinel/lease/v1/msg.proto

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sentinel.lease.v1;
33

44
import "gogoproto/gogo.proto";
55
import "sentinel/lease/v1/params.proto";
6+
import "sentinel/types/v1/price.proto";
67
import "sentinel/types/v1/renewal.proto";
78

89
option go_package = "github.com/sentinel-official/sentinelhub/v12/x/lease/types/v1";
@@ -18,14 +19,14 @@ message MsgRenewLeaseRequest {
1819
string from = 1;
1920
uint64 id = 2 [(gogoproto.customname) = "ID"];
2021
int64 hours = 3;
21-
string denom = 4;
22+
sentinel.types.v1.Price max_price = 4 [(gogoproto.nullable) = false];
2223
}
2324

2425
message MsgStartLeaseRequest {
2526
string from = 1;
2627
string node_address = 2;
2728
int64 hours = 3;
28-
string denom = 4;
29+
sentinel.types.v1.Price max_price = 4 [(gogoproto.nullable) = false];
2930
sentinel.types.v1.RenewalPricePolicy renewal_price_policy = 5;
3031
}
3132

proto/sentinel/node/v3/events.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ message EventPay {
1919
uint64 id = 1 [(gogoproto.customname) = "ID"];
2020
string acc_address = 2;
2121
string node_address = 3;
22-
string payment = 4;
22+
string amount = 4;
2323
string staking_reward = 5;
2424
}
2525

proto/sentinel/node/v3/msg.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ message MsgStartSessionRequest {
3434
string node_address = 2;
3535
int64 gigabytes = 3;
3636
int64 hours = 4;
37-
string denom = 5;
37+
sentinel.types.v1.Price max_price = 5 [(gogoproto.nullable) = false];
3838
}
3939

4040
message MsgUpdateParamsRequest {

types/v1/price.go

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,55 @@ func (p Price) String() string {
8989
}
9090

9191
func (p Price) IsEqual(v Price) bool {
92-
return p.Denom == v.Denom &&
93-
p.BaseValue.Equal(v.BaseValue) &&
94-
p.QuoteValue.Equal(v.QuoteValue)
92+
if p.Denom != v.Denom {
93+
return false
94+
}
95+
96+
if !p.BaseValue.IsZero() || !v.BaseValue.IsZero() {
97+
return p.BaseValue.Equal(v.BaseValue)
98+
}
99+
100+
return p.QuoteValue.Equal(v.QuoteValue)
101+
}
102+
103+
func (p Price) IsGT(v Price) bool {
104+
if p.Denom != v.Denom {
105+
return false
106+
}
107+
108+
if !p.BaseValue.IsZero() || !v.BaseValue.IsZero() {
109+
return p.BaseValue.GT(v.BaseValue)
110+
}
111+
112+
return p.QuoteValue.GT(v.QuoteValue)
113+
}
114+
115+
func (p Price) IsGTE(v Price) bool {
116+
if p.Denom != v.Denom {
117+
return false
118+
}
119+
120+
return !p.IsLT(v)
121+
}
122+
123+
func (p Price) IsLT(v Price) bool {
124+
if p.Denom != v.Denom {
125+
return false
126+
}
127+
128+
if !p.BaseValue.IsZero() || !v.BaseValue.IsZero() {
129+
return p.BaseValue.LT(v.BaseValue)
130+
}
131+
132+
return p.QuoteValue.LT(v.QuoteValue)
133+
}
134+
135+
func (p Price) IsLTE(v Price) bool {
136+
if p.Denom != v.Denom {
137+
return false
138+
}
139+
140+
return !p.IsGT(v)
95141
}
96142

97143
func (p Price) Validate() error {

x/lease/client/cli/flags.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,22 @@ import (
77
)
88

99
const (
10-
flagDenom = "denom"
10+
flagMaxPrice = "max-price"
1111
flagRenewalPricePolicy = "renewal-price-policy"
1212
)
1313

14+
func GetMaxPrice(flags *pflag.FlagSet) (v1base.Price, error) {
15+
s, err := flags.GetString(flagMaxPrice)
16+
if err != nil {
17+
return v1base.Price{}, err
18+
}
19+
if s == "" {
20+
return v1base.ZeroPrice(""), nil
21+
}
22+
23+
return v1base.NewPriceFromString(s)
24+
}
25+
1426
func GetRenewalPricePolicy(flags *pflag.FlagSet) (v1base.RenewalPricePolicy, error) {
1527
s, err := flags.GetString(flagRenewalPricePolicy)
1628
if err != nil {

x/lease/client/cli/tx.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func txRenewLease() *cobra.Command {
6666
return err
6767
}
6868

69-
denom, err := cmd.Flags().GetString(flagDenom)
69+
maxPrice, err := GetMaxPrice(cmd.Flags())
7070
if err != nil {
7171
return err
7272
}
@@ -75,7 +75,7 @@ func txRenewLease() *cobra.Command {
7575
ctx.FromAddress.Bytes(),
7676
id,
7777
hours,
78-
denom,
78+
maxPrice,
7979
)
8080
if err = msg.ValidateBasic(); err != nil {
8181
return err
@@ -86,7 +86,7 @@ func txRenewLease() *cobra.Command {
8686
}
8787

8888
flags.AddTxFlagsToCmd(cmd)
89-
cmd.Flags().String(flagDenom, "", "Specify the payment denomination for the lease")
89+
cmd.Flags().String(flagMaxPrice, "", "Specify the maximum hourly price for the lease")
9090

9191
return cmd
9292
}
@@ -112,7 +112,7 @@ func txStartLease() *cobra.Command {
112112
return err
113113
}
114114

115-
denom, err := cmd.Flags().GetString(flagDenom)
115+
maxPrice, err := GetMaxPrice(cmd.Flags())
116116
if err != nil {
117117
return err
118118
}
@@ -126,7 +126,7 @@ func txStartLease() *cobra.Command {
126126
ctx.FromAddress.Bytes(),
127127
nodeAddr,
128128
hours,
129-
denom,
129+
maxPrice,
130130
renewalPricePolicy,
131131
)
132132
if err = msg.ValidateBasic(); err != nil {
@@ -138,7 +138,7 @@ func txStartLease() *cobra.Command {
138138
}
139139

140140
flags.AddTxFlagsToCmd(cmd)
141-
cmd.Flags().String(flagDenom, "", "Specify the payment denomination for the lease")
141+
cmd.Flags().String(flagMaxPrice, "", "Specify the maximum hourly price for the lease")
142142
cmd.Flags().String(flagRenewalPricePolicy, "", "Specify the lease renewal price policy")
143143

144144
return cmd

x/lease/keeper/abci.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (k *Keeper) handleLeasePayouts(ctx sdk.Context) {
8080
ID: item.ID,
8181
NodeAddress: item.NodeAddress,
8282
ProvAddress: item.ProvAddress,
83-
Payment: payment.String(),
83+
Amount: payment.String(),
8484
StakingReward: reward.String(),
8585
},
8686
)
@@ -118,10 +118,10 @@ func (k *Keeper) handleLeaseRenewals(ctx sdk.Context) {
118118

119119
// Create a message to renew the lease
120120
msg := &v1.MsgRenewLeaseRequest{
121-
From: item.ProvAddress,
122-
ID: item.ID,
123-
Hours: item.MaxHours,
124-
Denom: item.Price.Denom,
121+
From: item.ProvAddress,
122+
ID: item.ID,
123+
Hours: item.MaxHours,
124+
MaxPrice: item.Price,
125125
}
126126

127127
// Get the appropriate handler for processing the renewal message

x/lease/keeper/msg_handler.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,18 @@ func (k *Keeper) HandleMsgRenewLease(ctx sdk.Context, msg *v1.MsgRenewLeaseReque
103103
return nil, types.NewErrorInvalidNodeStatus(nodeAddr, node.Status)
104104
}
105105

106-
price, found := node.HourlyPrice(msg.Denom)
106+
price, found := node.HourlyPrice(msg.MaxPrice.Denom)
107107
if !found {
108-
return nil, types.NewErrorPriceNotFound(msg.Denom)
108+
return nil, types.NewErrorPriceNotFound(msg.MaxPrice.Denom)
109109
}
110110

111111
price, err = price.UpdateQuoteValue(ctx, k.QuotePriceFunc)
112112
if err != nil {
113113
return nil, err
114114
}
115+
if price.IsGT(msg.MaxPrice) {
116+
return nil, types.NewErrorInvalidPrice(price)
117+
}
115118

116119
if err := lease.ValidateRenewalPolicies(price); err != nil {
117120
return nil, sdkerrors.Wrap(types.ErrInvalidRenewalPolicy, err.Error())
@@ -199,15 +202,18 @@ func (k *Keeper) HandleMsgStartLease(ctx sdk.Context, msg *v1.MsgStartLeaseReque
199202
return nil, types.NewErrorInvalidNodeStatus(nodeAddr, node.Status)
200203
}
201204

202-
price, found := node.HourlyPrice(msg.Denom)
205+
price, found := node.HourlyPrice(msg.MaxPrice.Denom)
203206
if !found {
204-
return nil, types.NewErrorPriceNotFound(msg.Denom)
207+
return nil, types.NewErrorPriceNotFound(msg.MaxPrice.Denom)
205208
}
206209

207210
price, err = price.UpdateQuoteValue(ctx, k.QuotePriceFunc)
208211
if err != nil {
209212
return nil, err
210213
}
214+
if price.IsGT(msg.MaxPrice) {
215+
return nil, types.NewErrorInvalidPrice(price)
216+
}
211217

212218
leaseExists := false
213219
k.IterateLeasesForNodeByProvider(ctx, nodeAddr, provAddr, func(_ int, _ v1.Lease) bool {

x/lease/types/errors.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ var (
1313
ErrDuplicateLease = sdkerrors.Register(ModuleName, 201, "duplicate lease")
1414
ErrInvalidHours = sdkerrors.Register(ModuleName, 202, "invalid hours")
1515
ErrInvalidNodeStatus = sdkerrors.Register(ModuleName, 203, "invalid node status")
16-
ErrInvalidProviderStatus = sdkerrors.Register(ModuleName, 204, "invalid provider status")
17-
ErrInvalidRenewalPolicy = sdkerrors.Register(ModuleName, 205, "invalid renewal policy")
18-
ErrLeaseNotFound = sdkerrors.Register(ModuleName, 206, "lease not found")
19-
ErrNodeNotFound = sdkerrors.Register(ModuleName, 207, "node not found")
20-
ErrPriceNotFound = sdkerrors.Register(ModuleName, 208, "price not found")
21-
ErrProviderNotFound = sdkerrors.Register(ModuleName, 209, "provider not found")
22-
ErrUnauthorized = sdkerrors.Register(ModuleName, 210, "unauthorized")
16+
ErrInvalidPrice = sdkerrors.Register(ModuleName, 204, "invalid price")
17+
ErrInvalidProviderStatus = sdkerrors.Register(ModuleName, 205, "invalid provider status")
18+
ErrInvalidRenewalPolicy = sdkerrors.Register(ModuleName, 206, "invalid renewal policy")
19+
ErrLeaseNotFound = sdkerrors.Register(ModuleName, 207, "lease not found")
20+
ErrNodeNotFound = sdkerrors.Register(ModuleName, 208, "node not found")
21+
ErrPriceNotFound = sdkerrors.Register(ModuleName, 209, "price not found")
22+
ErrProviderNotFound = sdkerrors.Register(ModuleName, 210, "provider not found")
23+
ErrUnauthorized = sdkerrors.Register(ModuleName, 211, "unauthorized")
2324
)
2425

2526
// NewErrorDuplicateLease returns an error indicating that a lease for the specified node and provider already exists.
@@ -37,6 +38,11 @@ func NewErrorInvalidNodeStatus(addr base.NodeAddress, status v1base.Status) erro
3738
return sdkerrors.Wrapf(ErrInvalidNodeStatus, "invalid status %s for node %s", status, addr)
3839
}
3940

41+
// NewErrorInvalidPrice returns an error indicating that the price is invalid.
42+
func NewErrorInvalidPrice(price v1base.Price) error {
43+
return sdkerrors.Wrapf(ErrInvalidPrice, "invalid price %s", price)
44+
}
45+
4046
// NewErrorInvalidProviderStatus returns an error indicating that the provided status is invalid for the given provider.
4147
func NewErrorInvalidProviderStatus(addr base.ProvAddress, status v1base.Status) error {
4248
return sdkerrors.Wrapf(ErrInvalidProviderStatus, "invalid status %s for provider %s", status, addr)

0 commit comments

Comments
 (0)