1. C lang: passing (void *) as an parameter (typed *) seems legit for the gcc compiler (apparently not so for g++) 2. the Nim to C backend _might_ actually consider the type of the message variable and create the proper/compatible parameter for the C call
both work in your favor and this simpler form also works (basically save some typing and let the C compiler do the pointer casting): proc crypto_ed25519_sign(signature: array[64, uint8]; secret_key: array[32, uint8]; message: ptr; message_size: csize) {.cdecl, importc: "crypto_ed25519_sign".} var msg = @[0xFE.uint8, 0x32, 0xd5, 0x5C, 0x77, 0x2A, 0x49, 0x11] crypto_ed25519_sign(sig, key, addr msg[0], len(msg))