Your mistake is binding EPs (Event Parameters) to ENs (Event Names). They're somewhat independent dimensions.
So that you would understand, the limit GA4 sets on the number of distinct event names is about 500. While the limit for the number of distinct custom dimensions is only 50. There is no expectation whatsoever that you would make custom dimensions for specific events. That said, you want your custom dimensions and event properties quite vaguely named.
It is normal to have the same event property and its custom dimension to mean different things depending on event.
In your case, however, they mean the same thing. All you need to do is to name them properly. Instead of having:
Dimension Name: opt_in_entry, Event Parameter: entry
Dimension Name: opt_in_cancel, Event Parameter: cancel
Dimension Name: opt_in_confirm, Event Parameter: confirm
You could have
Dimension Name: entry, Event Parameter: entry
Dimension Name: cancel, Event Parameter: cancel
Dimension Name: confirm, Event Parameter: confirm
It's pretty common and straightforward to name your CDs just as you name your EPs. Much easier to debug and maintain them that way.
However, why are you really wasting three dimensions when you can really just put all of this in one dimension, say calling it CTA
or even just type
so that it could be reused with other events.
So now your tracking network requests would look like:
...
en: "opt-in",
ep.type: "entry",
...
ep.type can be whatever type you want to set there.
And in GA4, in the explorer, you would just pull two events: the opt-in and the opt-out and then just one type
dimension for both events. You could also use a segment to limit the type values to these two events since pulling two event names can be awkward given how explorer is still has a long way to go in terms of usability.
This setup is quite elegant and doesn't waste space needlessly, while still allowing every kind of analysis.
Later on, you could reuse the type
property/dimension with, let's say, a scroll event. Where you would store in the type variable whether the scroll was done with mouse, or nav bar. If that's valuable to know.
Or you could decide to track the add to cart clicks on product pages, and type could store whether the main CTA had been clicked, or the bottom add to cart CTA, or maybe something else.
This basic custom dimensions recycling is intended and it's a must for proper analytics tracking maintenance. Once you have more custom dimensions and events permutations than you can easily keep track of, it's time to document them and that documentation would be a part of your analytics SDR (Solution Design Reference). Larger and more complex implementations would definitely always have a document like that to make it easier to manage.