1// Copyright 2015 The go-ethereum Authors
2// This file is part of the go-ethereum library.
3//
4// The go-ethereum library is free software: you can redistribute it and/or modify
5// it under the terms of the GNU Lesser General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// The go-ethereum library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU Lesser General Public License for more details.
13//
14// You should have received a copy of the GNU Lesser General Public License
15// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16
17package core
18
19import (
20	"fmt"
21	"math"
22)
23
24// GasPool tracks the amount of gas available during execution of the transactions
25// in a block. The zero value is a pool with zero gas available.
26type GasPool uint64
27
28// AddGas makes gas available for execution.
29func (gp *GasPool) AddGas(amount uint64) *GasPool {
30	if uint64(*gp) > math.MaxUint64-amount {
31		panic("gas pool pushed above uint64")
32	}
33	*(*uint64)(gp) += amount
34	return gp
35}
36
37// SubGas deducts the given amount from the pool if enough gas is
38// available and returns an error otherwise.
39func (gp *GasPool) SubGas(amount uint64) error {
40	if uint64(*gp) < amount {
41		return ErrGasLimitReached
42	}
43	*(*uint64)(gp) -= amount
44	return nil
45}
46
47// Gas returns the amount of gas remaining in the pool.
48func (gp *GasPool) Gas() uint64 {
49	return uint64(*gp)
50}
51
52func (gp *GasPool) String() string {
53	return fmt.Sprintf("%d", *gp)
54}
55