```ts
function traceParcel(events: string[]): string[] {
  if (!Array.isArray(events)) throw new Error('Input must be a list');
  
  const states = ['created'];
  
  for (const event of events) {
    switch (event) {
      case 'packed':
        if (states[states.length - 1] !== 'created') throw new Error('Event fired in an invalid state');
        states.push('packed');
        break;
      case 'shipped':
        if (states[states.length - 1] !== 'packed') throw new Error('Event fired in an invalid state');
        states.push('shipped');
        break;
      case 'delivered':
        if (states[states.length - 1] !== 'shipped' && states[states.length - 1] !== 'returned') throw new Error('Event fired in an invalid state');
        states.push('delivered');
        break;
      case 'returned':
        if (states[states.length - 1] !== 'delivered' && states[states.length - 1] !== 'shipped') throw new Error('Event fired in an invalid state');
        states.push('returned');
        break;
      default:
        throw new Error(`Invalid event: ${event}`);
    }
  }
  
  return states;
}
```