¿Cómo comparto una definición de enumeración entre contratos?

Tengo dos contratos relacionados, llamémoslos Suppliery Producer.

A Supplierpuede tener un Statede inactive, activeo kaput, pero solo activese pueden agregar proveedores a un Producer.

Así que algo como esto:

contract Supplier {
  enum State { inactive, active, kaput }
  State constant DEFAULT_STATE = State.inactive

  State public status;

  function Supplier() {
    status = DEFAULT_STATE;
  }
}

Pero hacer esto no funciona.

contract Producer {
  function addSupplier(Supplier _supplier) {
    require(_supplier.status == Supplier.State.active);
  }
}

Consideré usar una interfaz, pero enumestá específicamente prohibido en una interfaz.

¿Cómo expongo enumdefiniciones a contratos externos sin recurrir a algo feo comorequire(uint(supplier.status) == 1);

Respuestas (1)

Las enumeraciones definidas dentro de un contrato son accesibles de forma predeterminada desde otros contratos. En Producer puedes usar las expresiones:

  • Supplier.State.inactive

  • Supplier.State.active

  • Supplier.State.kaput

Su código no funciona porque publiclas variables de estado se comportan como funciones desde la perspectiva de otros contratos. Intenta reemplazar esta línea:

require(_supplier.status == Supplier.State.active);

con este:

require(_supplier.status() == Supplier.State.active);