JOSE: JWE CEK Initialization Vector Position or Reuse
So the answer thanks to @kelalaka's comments is that X25519 doesn't need an iv. I was not using just X25519, but instead x25519-xsalsa20-poly1305 via TweetNaCl.js.
There isn't really a need to use x25519-xsalsa20-poly1305 to wrap the AES-256-GCM key, as the &quot;xsalsa20 is a stream cipher and poly1305 is for mutual authentication&quot;.
Regarding JWE, there isn't a way to use x25519-xsalsa20-poly1305 with a JWE because JWE requires Authenticated Encryption Additional Data (AEAD) and salsa only has Authenticated Encryption (AE).
So my options with a JWE are to switch to just using x25519 + AES-256-GCM OR use just x25519-xsalsa20-poly1305 without using a JWE (or at least not a standards compliant one).