| 
									
										
										
										
											2017-04-14 10:29:00 +02:00
										 |  |  | // Copyright 2016 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // 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. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package vm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2017-01-05 14:03:50 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StateDB is an EVM database for full state querying. | 
					
						
							|  |  |  | type StateDB interface { | 
					
						
							| 
									
										
										
										
											2017-02-22 23:29:59 +01:00
										 |  |  | 	CreateAccount(common.Address) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SubBalance(common.Address, *big.Int) | 
					
						
							|  |  |  | 	AddBalance(common.Address, *big.Int) | 
					
						
							|  |  |  | 	GetBalance(common.Address) *big.Int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GetNonce(common.Address) uint64 | 
					
						
							|  |  |  | 	SetNonce(common.Address, uint64) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GetCodeHash(common.Address) common.Hash | 
					
						
							|  |  |  | 	GetCode(common.Address) []byte | 
					
						
							|  |  |  | 	SetCode(common.Address, []byte) | 
					
						
							|  |  |  | 	GetCodeSize(common.Address) int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-13 13:47:27 +02:00
										 |  |  | 	AddRefund(uint64) | 
					
						
							| 
									
										
										
										
											2018-08-11 23:03:54 +02:00
										 |  |  | 	SubRefund(uint64) | 
					
						
							| 
									
										
										
										
											2017-11-13 13:47:27 +02:00
										 |  |  | 	GetRefund() uint64 | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 16:24:35 +03:00
										 |  |  | 	GetCommittedState(common.Address, common.Hash) common.Hash | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 	GetState(common.Address, common.Hash) common.Hash | 
					
						
							|  |  |  | 	SetState(common.Address, common.Hash, common.Hash) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Suicide(common.Address) bool | 
					
						
							|  |  |  | 	HasSuicided(common.Address) bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Exist reports whether the given account exists in state. | 
					
						
							|  |  |  | 	// Notably this should also return true for suicided accounts. | 
					
						
							|  |  |  | 	Exist(common.Address) bool | 
					
						
							|  |  |  | 	// Empty returns whether the given account is empty. Empty | 
					
						
							|  |  |  | 	// is defined according to EIP161 (balance = nonce = code = 0). | 
					
						
							|  |  |  | 	Empty(common.Address) bool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-25 07:26:57 -07:00
										 |  |  | 	PrepareAccessList(sender common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) | 
					
						
							| 
									
										
										
										
											2020-10-23 08:26:57 +02:00
										 |  |  | 	AddressInAccessList(addr common.Address) bool | 
					
						
							|  |  |  | 	SlotInAccessList(addr common.Address, slot common.Hash) (addressOk bool, slotOk bool) | 
					
						
							|  |  |  | 	// AddAddressToAccessList adds the given address to the access list. This operation is safe to perform | 
					
						
							|  |  |  | 	// even if the feature/fork is not active yet | 
					
						
							|  |  |  | 	AddAddressToAccessList(addr common.Address) | 
					
						
							|  |  |  | 	// AddSlotToAccessList adds the given (address,slot) to the access list. This operation is safe to perform | 
					
						
							|  |  |  | 	// even if the feature/fork is not active yet | 
					
						
							|  |  |  | 	AddSlotToAccessList(addr common.Address, slot common.Hash) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 	RevertToSnapshot(int) | 
					
						
							|  |  |  | 	Snapshot() int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 14:03:50 +01:00
										 |  |  | 	AddLog(*types.Log) | 
					
						
							| 
									
										
										
										
											2017-01-17 11:19:50 +00:00
										 |  |  | 	AddPreimage(common.Hash, []byte) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 14:44:02 +08:00
										 |  |  | 	ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 17:48:15 +08:00
										 |  |  | // CallContext provides a basic interface for the EVM calling conventions. The EVM | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | // depends on this context being implemented for doing subcalls and initialising new EVM contracts. | 
					
						
							|  |  |  | type CallContext interface { | 
					
						
							|  |  |  | 	// Call another contract | 
					
						
							| 
									
										
										
										
											2017-01-05 11:52:10 +01:00
										 |  |  | 	Call(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 	// Take another's contract code and execute within our own context | 
					
						
							| 
									
										
										
										
											2017-01-05 11:52:10 +01:00
										 |  |  | 	CallCode(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 	// Same as CallCode except sender and value is propagated from parent to child scope | 
					
						
							| 
									
										
										
										
											2017-01-05 11:52:10 +01:00
										 |  |  | 	DelegateCall(env *EVM, me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 	// Create a new contract | 
					
						
							| 
									
										
										
										
											2017-01-05 11:52:10 +01:00
										 |  |  | 	Create(env *EVM, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | } |