| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | package vm | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2015-04-03 11:27:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/params" | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	GasQuickStep   uint64 = 2 | 
					
						
							|  |  |  | 	GasFastestStep uint64 = 3 | 
					
						
							|  |  |  | 	GasFastStep    uint64 = 5 | 
					
						
							|  |  |  | 	GasMidStep     uint64 = 8 | 
					
						
							|  |  |  | 	GasSlowStep    uint64 = 10 | 
					
						
							|  |  |  | 	GasExtStep     uint64 = 20 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GasReturn       uint64 = 0 | 
					
						
							|  |  |  | 	GasStop         uint64 = 0 | 
					
						
							|  |  |  | 	GasContractByte uint64 = 200 | 
					
						
							| 
									
										
										
										
											2015-03-16 21:46:47 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | // calcGas returns the actual gas cost of the call. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The cost of gas was changed during the homestead price change HF. To allow for EIP150 | 
					
						
							|  |  |  | // to be implemented. The returned gas is gas - base * 63 / 64. | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | func callGas(gasTable params.GasTable, availableGas, base uint64, callCost *big.Int) (uint64, error) { | 
					
						
							|  |  |  | 	if gasTable.CreateBySuicide > 0 { | 
					
						
							|  |  |  | 		availableGas = availableGas - base | 
					
						
							|  |  |  | 		gas := availableGas - availableGas/64 | 
					
						
							|  |  |  | 		// If the bit length exceeds 64 bit we know that the newly calculated "gas" for EIP150 | 
					
						
							|  |  |  | 		// is smaller than the requested amount. Therefor we return the new gas instead | 
					
						
							|  |  |  | 		// of returning an error. | 
					
						
							|  |  |  | 		if callCost.BitLen() > 64 || gas < callCost.Uint64() { | 
					
						
							|  |  |  | 			return gas, nil | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | 	if callCost.BitLen() > 64 { | 
					
						
							|  |  |  | 		return 0, errGasUintOverflow | 
					
						
							| 
									
										
										
										
											2015-03-10 00:25:27 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | 	return callCost.Uint64(), nil | 
					
						
							| 
									
										
										
										
											2015-03-27 16:09:57 +01:00
										 |  |  | } |