Skip to content

Commit ca41fe5

Browse files
committed
Use uint64 to track rclimit
Resolves #163
1 parent f782aec commit ca41fe5

File tree

2 files changed

+59
-26
lines changed

2 files changed

+59
-26
lines changed

internal/cli/commands.go

+39-13
Original file line numberDiff line numberDiff line change
@@ -956,59 +956,85 @@ func (c *RcLimitCommand) Execute(ctx context.Context, ee *ExecutionEnvironment)
956956
// If no limit given, display current
957957
if c.limit == nil {
958958
if ee.rcLimit.absolute {
959-
result.AddMessage(fmt.Sprintf("Current rc limit: %f", ee.rcLimit.value))
959+
decAmount, err := util.SatoshiToDecimal(ee.rcLimit.value, cliutil.KoinPrecision)
960+
if err != nil {
961+
return nil, err
962+
}
963+
result.AddMessage(fmt.Sprintf("Current rc limit: %v", decAmount))
960964
return result, nil
961965
}
962966

963967
// Otherwise its relative
964968
if !ee.IsOnline() || !ee.IsWalletOpen() {
965-
result.AddMessage(fmt.Sprintf("Current rc limit: %f%%", ee.rcLimit.value*100))
969+
decAmount, err := util.SatoshiToDecimal(ee.rcLimit.value, cliutil.KoinPrecision)
970+
resultVal := decimal.NewFromFloat(100).Mul(*decAmount)
971+
if err != nil {
972+
return nil, err
973+
}
974+
result.AddMessage(fmt.Sprintf("Current rc limit: %v%%", resultVal))
966975
return result, nil
967976
}
968977

969-
limit, err := ee.RPCClient.GetAccountRc(ctx, ee.Key.AddressBytes())
978+
amount, err := ee.GetRcLimit(ctx)
979+
if err != nil {
980+
return nil, err
981+
}
982+
983+
decAmount, err := util.SatoshiToDecimal(amount, cliutil.KoinPrecision)
970984
if err != nil {
971985
return nil, err
972986
}
973987

974-
dAmount, err := util.SatoshiToDecimal(limit, cliutil.KoinPrecision)
988+
decLimit, err := util.SatoshiToDecimal(ee.rcLimit.value, cliutil.KoinPrecision)
975989
if err != nil {
976990
return nil, err
977991
}
978992

979-
f, _ := dAmount.Mul(decimal.NewFromFloat(ee.rcLimit.value)).Float64()
980-
result.AddMessage(fmt.Sprintf("Current rc limit: %f%% (%f)", ee.rcLimit.value*100, f))
993+
result.AddMessage(fmt.Sprintf("Current rc limit: %v%% (%v)", decLimit.Mul(decimal.NewFromInt(100)), decAmount))
981994
return result, nil
982995
}
983996

984997
// Otherwise we are setting the limit
985998
s := *c.limit
986999
if s[len(s)-1] == '%' {
987-
res, err := strconv.ParseFloat(s[:len(s)-1], 64)
1000+
res, err := decimal.NewFromString(s[:len(s)-1])
9881001
if err != nil {
9891002
return nil, err
9901003
}
9911004

9921005
// Check bounds
993-
if res < 0 || res > 100 {
1006+
if res.LessThan(decimal.NewFromInt(0)) || res.GreaterThan(decimal.NewFromInt(100)) {
9941007
return nil, fmt.Errorf("%w: percentage rc limit must be between 0%% and 100%%", cliutil.ErrInvalidParam)
9951008
}
9961009

997-
ee.rcLimit.value = res / 100.0
1010+
// Convert to decimal
1011+
resFrac := res.Div(decimal.NewFromInt(100))
1012+
val, err := util.DecimalToSatoshi(&resFrac, cliutil.KoinPrecision)
1013+
if err != nil {
1014+
return nil, err
1015+
}
1016+
1017+
ee.rcLimit.value = val
9981018
ee.rcLimit.absolute = false
999-
result.AddMessage(fmt.Sprintf("Set rc limit to %f%%", res))
1019+
result.AddMessage(fmt.Sprintf("Set rc limit to %v%%", res))
10001020
return result, nil
10011021
}
10021022

10031023
// Otherwise we are setting the absolute limit
1004-
res, err := strconv.ParseFloat(s, 64)
1024+
res, err := decimal.NewFromString(s)
1025+
if err != nil {
1026+
return nil, err
1027+
}
1028+
1029+
// Convert to satoshi
1030+
val, err := util.DecimalToSatoshi(&res, cliutil.KoinPrecision)
10051031
if err != nil {
10061032
return nil, err
10071033
}
10081034

1009-
ee.rcLimit.value = res
1035+
ee.rcLimit.value = val
10101036
ee.rcLimit.absolute = true
1011-
result.AddMessage(fmt.Sprintf("Set rc limit to %f", res))
1037+
result.AddMessage(fmt.Sprintf("Set rc limit to %v", res))
10121038

10131039
return result, nil
10141040
}

internal/cli/interpreter.go

+20-13
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/koinos/koinos-cli/internal/cliutil"
1313
"github.com/koinos/koinos-proto-golang/koinos/protocol"
1414
util "github.com/koinos/koinos-util-golang"
15-
"github.com/shopspring/decimal"
1615
)
1716

1817
// Command execution code
@@ -55,7 +54,7 @@ func (er *ExecutionResult) Print() {
5554
}
5655

5756
type rcInfo struct {
58-
value float64
57+
value uint64
5958
absolute bool
6059
}
6160

@@ -86,7 +85,7 @@ func NewExecutionEnvironment(rpcClient *cliutil.KoinosRPCClient, parser *Command
8685
Contracts: make(map[string]*ContractInfo),
8786
Session: &TransactionSession{},
8887
nonceMap: make(map[string]*nonceInfo),
89-
rcLimit: rcInfo{value: 1.0, absolute: false},
88+
rcLimit: rcInfo{value: 100000000, absolute: false},
9089
payer: SelfPayer,
9190
chainID: AutoChainID,
9291
nonceMode: AutoNonce,
@@ -184,14 +183,7 @@ func (ee *ExecutionEnvironment) GetChainID(ctx context.Context) ([]byte, error)
184183
// GetRcLimit returns the current RC limit
185184
func (ee *ExecutionEnvironment) GetRcLimit(ctx context.Context) (uint64, error) {
186185
if ee.rcLimit.absolute {
187-
dAmount := decimal.NewFromFloat(ee.rcLimit.value)
188-
189-
val, err := util.DecimalToSatoshi(&dAmount, cliutil.KoinPrecision)
190-
if err != nil {
191-
return 0, fmt.Errorf("%w: %s", cliutil.ErrInvalidAmount, err.Error())
192-
}
193-
194-
return val, nil
186+
return ee.rcLimit.value, nil
195187
}
196188

197189
// else it's relative
@@ -200,8 +192,23 @@ func (ee *ExecutionEnvironment) GetRcLimit(ctx context.Context) (uint64, error)
200192
return 0, err
201193
}
202194

203-
val := uint64(float64(limit) * ee.rcLimit.value)
204-
return val, nil
195+
decLimit, err := util.SatoshiToDecimal(limit, 8)
196+
if err != nil {
197+
return 0, err
198+
}
199+
200+
decVal, err := util.SatoshiToDecimal(ee.rcLimit.value, 8)
201+
if err != nil {
202+
return 0, err
203+
}
204+
205+
decResult := decLimit.Mul(*decVal)
206+
res, err := util.DecimalToSatoshi(&decResult, 8)
207+
if err != nil {
208+
return 0, err
209+
}
210+
211+
return res, nil
205212
}
206213

207214
// SubmitTransaction is a utility function to submit a transaction from a command

0 commit comments

Comments
 (0)