Skip to content

Commit

Permalink
fix gas adapter (#2099)
Browse files Browse the repository at this point in the history
  • Loading branch information
scottafk authored Jan 13, 2023
1 parent dd67012 commit 6729de6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 24 deletions.
41 changes: 19 additions & 22 deletions packages/smart/gas.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,13 @@ func (c Combustion) Detail(sum decimal.Decimal) any {
}

func (pay *PaymentInfo) PushFuelCategories(fes ...FuelCategory) {
for i := range fes {
fes[i].writeDecimal(fes[i].Decimal.Mul(pay.FuelRate))
}
pay.FuelCategories = append(pay.FuelCategories, fes...)
}

func (pay *PaymentInfo) SetDecimalByType(fuelType FuelType, decimal decimal.Decimal) {
for i, v := range pay.FuelCategories {
if v.FuelType == fuelType {
pay.FuelCategories[i].writeDecimal(decimal.Mul(pay.FuelRate))
pay.FuelCategories[i].writeDecimal(decimal)
break
}
}
Expand Down Expand Up @@ -291,7 +288,7 @@ func (sc *SmartContract) payContract(errNeedPay bool) error {
for i := 0; i < len(sc.multiPays); i++ {
pay := sc.multiPays[i]
pay.Penalty = sc.Penalty
pay.SetDecimalByType(FuelType_vmCost_fee, sc.TxUsedCost)
pay.SetDecimalByType(FuelType_vmCost_fee, sc.TxUsedCost.Mul(pay.FuelRate))
money := pay.GetPayMoney()
wltAmount := pay.PayWallet.CapableAmount()
if wltAmount.Cmp(money) < 0 {
Expand Down Expand Up @@ -523,16 +520,15 @@ func (sc *SmartContract) getChangeAddress(eco int64) ([]*PaymentInfo, error) {
if curPay.TaxesID, err = sc.taxesWallet(curPay.TokenEco); err != nil {
return nil, err
}

if elementFee, err = sc.elementFee(); err != nil {
if elementFee, err = elementFeeBy(sc.TxContract.Name, int32(curPay.Ecosystem.Digits)); err != nil {
return nil, err
}

if expediteFee, err = sc.expediteFee(); err != nil {
if expediteFee, err = expediteFeeBy(sc.TxSmart.Expedite, int32(curPay.Ecosystem.Digits)); err != nil {
return nil, err
}

storageFee = sc.storageFee()
storageFee = storageFeeBy(sc.TxSize, int32(curPay.Ecosystem.Digits))

curPay.FromID, curPay.PaymentType = sc.getFromIdAndPayType(curPay.TokenEco)
if feeMode != nil && eco != consts.DefaultTokenEcosystem {
Expand Down Expand Up @@ -803,22 +799,20 @@ func (sc *SmartContract) taxesWallet(eco int64) (taxesID int64, err error) {
return
}

func (sc *SmartContract) elementFee() (decimal.Decimal, error) {
func elementFeeBy(contractName string, digits int32) (decimal.Decimal, error) {
var (
elementFee decimal.Decimal
err error
zero = decimal.Zero
)
if priceName, ok := syspar.GetPriceCreateExec(utils.ToSnakeCase(sc.TxContract.Name)); ok {
if priceName, ok := syspar.GetPriceCreateExec(utils.ToSnakeCase(contractName)); ok {
newElementPrices := decimal.NewFromInt(priceName).
Mul(decimal.NewFromInt(syspar.SysInt64(syspar.PriceCreateRate)))
Mul(decimal.New(1, digits))
if newElementPrices.GreaterThan(decimal.New(MaxPrice, 0)) {
sc.GetLogger().WithFields(log.Fields{"type": consts.NoFunds}).Error("Price value is more than the highest value")
err = errMaxPrice
return zero, err
}
if newElementPrices.LessThan(zero) {
sc.GetLogger().WithFields(log.Fields{"type": consts.NoFunds}).Error("Price value is negative")
err = errNegPrice
return zero, err
}
Expand All @@ -827,29 +821,32 @@ func (sc *SmartContract) elementFee() (decimal.Decimal, error) {
return elementFee, err
}

func (sc *SmartContract) storageFee() decimal.Decimal {
func storageFeeBy(txSize int64, digits int32) decimal.Decimal {
var (
storageFee decimal.Decimal
zero = decimal.Zero
)
storageFee = decimal.NewFromInt(syspar.SysInt64(syspar.PriceTxSize)).
Mul(decimal.NewFromInt(syspar.SysInt64(syspar.PriceCreateRate))).
Mul(decimal.NewFromInt(sc.TxSize)).
Mul(decimal.New(1, digits)).
Mul(decimal.NewFromInt(txSize)).
Div(decimal.NewFromInt(consts.ChainSize))
if storageFee.LessThanOrEqual(zero) {
storageFee = decimal.New(1, 0)
}
return storageFee
}

func (sc *SmartContract) expediteFee() (decimal.Decimal, error) {
func expediteFeeBy(expedite string, digits int32) (decimal.Decimal, error) {
zero := decimal.Zero
if len(sc.TxSmart.Expedite) > 0 {
expedite, _ := decimal.NewFromString(sc.TxSmart.Expedite)
if len(expedite) > 0 {
expedite, err := decimal.NewFromString(expedite)
if err != nil {
return zero, fmt.Errorf("expediteFeeBy: %s", err)
}
if expedite.LessThan(zero) {
return zero, fmt.Errorf(eGreaterThan, sc.TxSmart.Expedite)
return zero, fmt.Errorf(eGreaterThan, expedite)
}
return expedite.Mul(decimal.NewFromInt(syspar.SysInt64(syspar.PriceCreateRate))), nil
return expedite.Shift(digits), nil
}
return zero, nil
}
3 changes: 2 additions & 1 deletion packages/smart/smart_p.go
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,8 @@ func UtxoToken(sc *SmartContract, toID int64, value string) (flag bool, err erro
if len(txInputs) == 0 {
return false, fmt.Errorf(eEcoCurrentBalance, converter.IDToAddress(fromID), ecosystem)
}
if expediteFee, err = sc.expediteFee(); err != nil {

if expediteFee, err = expediteFeeBy(sc.TxSmart.Expedite, consts.MoneyDigits); err != nil {
return false, err
}
totalAmount := decimal.Zero
Expand Down
5 changes: 4 additions & 1 deletion packages/types/custom_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,10 @@ func (t SmartTransaction) Hash() ([]byte, error) {

func (txSmart *SmartTransaction) Validate() error {
if len(txSmart.Expedite) > 0 {
expedite, _ := decimal.NewFromString(txSmart.Expedite)
expedite, err := decimal.NewFromString(txSmart.Expedite)
if err != nil {
return fmt.Errorf("wrong expedite format")
}
if expedite.LessThan(decimal.Zero) {
return fmt.Errorf("expedite fee %s must be greater than 0", expedite)
}
Expand Down

0 comments on commit 6729de6

Please sign in to comment.