@Nullable Equation contractEquation(int i, Value inValue, boolean stable) {
    final InOut direction = new InOut(i, inValue);
    final EKey key = new EKey(method, direction, stable);
    final Result result;
    if (exception || (inValue == Value.Null && interpreter.dereferencedParams[i])) {
      result = Value.Bot;
    }
    else if (FalseValue == returnValue) {
      result = Value.False;
    }
    else if (TrueValue == returnValue) {
      result = Value.True;
    }
    else if (returnValue instanceof TrackableNullValue) {
      result = Value.Null;
    }
    else if (returnValue instanceof NotNullValue || ThisValue == returnValue) {
      result = Value.NotNull;
    }
    else if (returnValue instanceof NthParamValue && ((NthParamValue)returnValue).n == i) {
      result = inValue;
    }
    else if (returnValue instanceof TrackableCallValue call) {
      Set<EKey> keys = call.getKeysForParameter(i, direction);
      if (ASMUtils.isReferenceType(call.getType())) {
        keys.add(new EKey(call.method, Out, call.stableCall));
      }
      if (keys.isEmpty()) {
        return null;
      } else {
        result = new Pending(Collections.singleton(new Component(Value.Top, keys)));
      }
    }
    else {
      return null;
    }
    return new Equation(key, result);
  }
@Nullable Equation contractEquation(int i, Value inValue, boolean stable)