diff --git a/precompiles/common/utils.go b/precompiles/common/utils.go index 520dc5e..0db1efc 100644 --- a/precompiles/common/utils.go +++ b/precompiles/common/utils.go @@ -42,8 +42,13 @@ func ParseAmount(event sdk.Event) (*uint256.Int, error) { return nil, fmt.Errorf("failed to parse coins from %q: %w", amountAttr.Value, err) } - amountBigInt := amountCoins.AmountOf(evmtypes.GetEVMCoinDenom()).BigInt() - amount, err := utils.Uint256FromBigInt(evmtypes.ConvertAmountTo18DecimalsBigInt(amountBigInt)) + baseAmount := amountCoins.AmountOf(evmtypes.GetEVMCoinDenom()).BigInt() + amountBigInt := evmtypes.ConvertAmountTo18DecimalsBigInt(baseAmount) + if evmtypes.GetEVMCoinExtendedDenom() != evmtypes.GetEVMCoinDenom() { + extendedAmount := amountCoins.AmountOf(evmtypes.GetEVMCoinExtendedDenom()).BigInt() + amountBigInt = new(big.Int).Add(amountBigInt, extendedAmount) + } + amount, err := utils.Uint256FromBigInt(amountBigInt) if err != nil { return nil, fmt.Errorf("failed to convert coin amount to Uint256: %w", err) } diff --git a/x/vm/statedb/state_object.go b/x/vm/statedb/state_object.go index 0b06e64..a93f3dc 100644 --- a/x/vm/statedb/state_object.go +++ b/x/vm/statedb/state_object.go @@ -2,6 +2,7 @@ package statedb import ( "bytes" + "fmt" "math/big" "sort" @@ -147,7 +148,16 @@ func (s *stateObject) SubBalance(amount *uint256.Int) uint256.Int { if amount.IsZero() { return *(s.Balance()) } - return s.SetBalance(new(uint256.Int).Sub(s.Balance(), amount)) + balance := s.Balance() + if balance.Lt(amount) { + panic(fmt.Sprintf( + "state balance underflow for %s: have=%s sub=%s", + s.address.Hex(), + balance.String(), + amount.String(), + )) + } + return s.SetBalance(new(uint256.Int).Sub(balance, amount)) } // SetBalance updates account balance.