code: func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.StateDB) ([]byte, uint64, bool, error) {
  	// Ensure message is initialized properly.
  	if call.GasPrice == nil {
  		call.GasPrice = big.NewInt(1)
  	}
  	if call.Gas == 0 {
  		call.Gas = 50000000
  	}
  	if call.Value == nil {
  		call.Value = new(big.Int)
  	}
  	// Set infinite balance to the fake caller account.
  	from := statedb.GetOrNewStateObject(call.From)
  	from.SetBalance(math.MaxBig256)
  	// Execute the call.
  	msg := callmsg{call}
  
  	evmContext := core.NewEVMContext(msg, block.Header(), b.blockchain, nil)
  	// Create a new environment which holds all relevant information
  	// about the transaction and calling mechanisms.
  	vmenv := vm.NewEVM(evmContext, statedb, b.config, vm.Config{})
  	gaspool := new(core.GasPool).AddGas(math.MaxUint64)
  
  	return core.NewStateTransition(vmenv, msg, gaspool).TransitionDb()
  }
docs: // callContract implements common code between normal and pending contract calls.
  // state is modified during execution, make sure to copy it if necessary.